*transaction ์ฒ๋ฆฌ (DB์ ๋ฌด์ฒ๋ฆฌ์ ๋จ์ – insert, update, delete๋ก ๊ตฌ์ฑ)
- java.sql.Connection์ auto commit์ด ๊ธฐ๋ณธ ์ค์
Connection.setAutoCommit( true ); => ์ฟผ๋ฆฌ๋ฌธ ํ๋๋ก Transaction์ด ์๋ฃ๋จ
<n๊ฐ์ ์ฟผ๋ฆฌ์ผ ๊ฒฝ์ฐ>
- ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ด (insert, update, delete) ํ๋์ Transaction์ ๊ตฌ์ฑํด์ผํ๋ ๊ฒฝ์ฐ
setAutoCommit( false )๋ก ๋ฐ๊ฟ ์ค์ ํ๊ณ , ์ฟผ๋ฆฌ ์ํํ ํ์๋ฅผ ๋น๊ตํด์ commit() ๋๋ rollback()์ ์ํ
- Connection์ด close๊ฐ ๋๋ค๋ฉด(์ ์ ์ข
๋ฃ) commit์ ์ํํ ํ ์ฐ๊ฒฐ์ด ๋์ด์ง
( ์ฟผ๋ฆฌ๋ฌธ ์ํ ์ค Connection์ด close ๋๋ฉด ์๋จ – ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ ์ค ํ๋์ ์ฟผ๋ฆฌ๊ฐ ์คํจํ๋๋ผ๋ ๋๋จธ์ง๋
commit์ด ๋๋ ์ผ๊ด์ฑ์ ๋ฌธ์ ๋ฐ์) >> ๋ชจ๋ ์์
์ด ์คํจ ํน์ ์ฑ๊ณตํ๋ ์ผ๊ด์ฑ์ด ํ์ํจ
- ๋ค๋ฅธ method์์ Connection์ ๋์๋ ค๋ฉด Field์ connection์ ์ฌ๋ ค์ผํจ
- transaction() : int // ์ฌ๋ฌ ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์์ ์ด ๊ตฌ์ฑ๋ ๋ฉ์๋, ์คํ๋ ํ์๋ฅผ ๋ฐํ
- useTransaction() : void // ์คํ๋ ํ์๋ฅผ ๋ฐ์ ํธ๋์ญ์ ์คํ(๋ชฉํ๋ก ํ๋ ํ์์ ๋น๊ตํด์) commit ํน์ rollback, DBMS ์ฐ๊ฒฐ๋๊ธฐ
*์ฌ๋ฌ ๊ฐ์ insert๊ฐ ํ๋์ Transaction์ผ๋ก ๊ตฌ์ฑ๋ ๋์๋ commit ๋๋ ์์ธ๋ก ์ฒ๋ฆฌ
*์ฌ๋ฌ ๊ฐ์ update๋ delete๊ฐ ํ๋์ Transaction์ผ๋ก ๊ตฌ์ฑ๋ ๋์๋ commit๊ณผ rollback์ ์ฒ๋ฆฌ
*Procedure
- ์์ฃผ ์ฌ์ฉ๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋ฏธ๋ฆฌ ์์ฑํ์ฌ ์ ์ฅํด๋๊ณ , ํ์ํ ๊ณณ์์ ์คํํ์ฌ ์ฌ์ฉํ๊ธฐ ์ํด ์์ฑํ๋ ๊ฒ
- PL(Procedural Language) /SQL๋ฌธ ์ค ํ๋
( ๊ธฐ๋ณธ๋ฌธ๋ฒ, ์ฐ์ฐ์, ์ ์ด๋ฌธ, function, procedure, trigger, package๋ก ๊ตฌ์ฑ )
- function: ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ์ ๋ฌด๋ก์ง ์ค์
- procedure : ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ๊ณ ์ ๋ฌด๋ก์ง๋ ๊ฐ์ด ๊ตฌํ
- trigger: ์ฐ์์์ฉ. ํ๋์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ฉด ์๋์ผ๋ก ์คํ๋๋ ๊ฒ
- ์์์ ์ปค์์ ๋ช ์์ ์ปค์๋ฅผ ์ฌ์ฉ ํ ์ ์์
- ์์์ ์ปค์: insert,update,delete ์ฟผ๋ฆฌ๋ฌธ์ด ์ํ๋ ํ์๋ฅผ ์ ์ฅํ๊ณ ์๋ ์๋ ์์ฑ๋๋ ์ปค์
sql %rowcount
(์์์ ์ปค์) (์์ฑ) - ๋ช ์์ ์ปค์: ์ฌ๋ฌ ํ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ select๋ฌธ์ ์ ์ฅํ๊ณ ์คํํ๊ธฐ ์ํ, ๊ฐ๋ฐ์๊ฐ ์ ์ํ๋ ์ปค์
select ํจ์๋ช (์ปฌ๋ผ๋ช )
- ์คํ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ง์ ์คํ์ ์ํ (ํจ์๋ ๊ฐ์ ์คํ- ์ฟผ๋ฆฌ๋ฌธ์ ๋ฃ์ด์ ์คํ)
exec [ execute ] <- sql shell์์ ์ง์ ์คํ
sql> exec ํ๋ก์์ ๋ช
(๊ฐ,,,)
- ๋ฐํํ์ด ์์( out parameter๋ฅผ ์ฌ์ฉ – ํ์ํ ์ ๋งํผ ์ธ๋ถ๋ก ๋ด๋ณด๋ผ ์ ์์)
- ์ปดํ์ผ์ ํ๋ฉด (DD์ Procedure๊ฐ ์ถ๊ฐ๋จ) ๊ทธ ํ ์คํํจ // user_procedures
- ์
๋ฌด๋ก์ง์ ํ๋์ด๋ฉด์ ํ๋ฉด์ด ๋ค์ํ๊ฒ ๋ง๋ค์ด์ ธ์ผ ํ ๋ procedure๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํจ
๋์ผํ ์
๋ฌด๋ฅผ 3๋ฒ ๋ง๋ค์ด ์ฝ๋ฉํ๋ฉด ์
๋ฌด๊ฐ ๋ฐ๋์์ ๋ ๊ฐ๊ฐ 3๋ฒ ์ฝ๋๋ฅผ ์์ ํด์ผ ํจ > ์ ๋ฌด๋ก์ง์ DB์ชฝ์ผ๋ก ์ฎ๊ธด๋ค >>> procedure๋ฅผ ๊ฐ๊ฐ ๊ฐ์ ธ๋ค๊ฐ ์ธ ์ ์์ DB์์ ํ๋์ ์ ๋ฌด๋ก์ง์ ๊ฐ์ ธ๋ค ์ฐ๋ฉด >> ๋ทฐ๊ฐ ๋ค์ํด๋ ๋ชจ๋ ์์ ๋ ์ ๋ฌด ๋ก์ง์ ๋ฐ์ ์ธ ์ ์์ |
||
Windows์์ ์ฌ์ฉ์ ํธ์์ฑ์ ๊ณ ๋ คํ ํ๋ก๊ทธ๋จ 1.Java 2.MFC 3.VB 4.Python |
Web์์ ์ฌ์ฉ์ ํธ์์ฑ์ ๊ณ ๋ คํ ํ๋ก๊ทธ๋จ 1.JSP 2.ASP 3.PHP 4.Python |
APP์ผ๋ก ์ฌ์ฉ์ ํธ์์ฑ์ ๊ณ ๋ คํ ํ๋ก๊ทธ๋จ 1. Android 2. IOS 3. Hybrid App |
*Procedure ์์ฑ
๋ฌธ๋ฒ)
1.์์ฑ :
create or replace procedure ํ๋ก์์ ๋ช
( ๋งค๊ฐ๋ณ์๋ช
์ข
๋ฅ ๋ฐ์ดํฐํ,,, )
is
๋ณ์์ ์ธ, record์ ์ธ, table์ ์ธ, cursor ์ ์ธ // record: VO์ ๋น์ทํ ๊ฐ์ฒด, ์ฌ๋ฌ ๊ฐ์ ๋ฌถ์ด์ ํ๋ฒ์ ์ ์ฅ
// table: SQL์ ํ
์ด๋ธ์ด ์๋ ๋ฐฐ์ด๊ณผ ๋น์ทํ ๊ฐ์ฒด
begin
์ฐ์ฐ์, ์ ์ด๋ฌธ, ์ฟผ๋ฆฌ๋ฌธ, ์ปค์์ ์ฌ์ฉ
end;
/
2. ์ ์ฅ : ํ์ผ๋ช .sql
3. ์ปดํ์ผ (sqlplus์ ์ ์) : sql> @ํ์ผ๋ช
--cp_emp์ ์ถ๊ฐํ๋ procedure
create or replace procedure insert_cp_emp (empno number, ename varchar2, row_cnt out number, msg out varchar2)
is
--๋ณ์, ์ปค์ ๋ฑ ์ ์ธ
cnt number(1) := 0;
begin
-- ์ฐ์ฐ์,์ ์ด๋ฌธ,์ฟผ๋ฆฌ๋ฌธ,์ปค์ ์ฌ์ฉ
insert into cp_emp ( empno, ename)
values(empno, ename)
cnt : = sql%rowcount; -- ์ฟผ๋ฆฌ๋ฌธ์ด ์คํ๋ ํ์๋ฅผ ์ ์ฅํ๋ ์์์ ์ปค์ ์ฌ์ฉ
if cnt = 1 then
msg := empno||'๋ฒ ์ฌ์ ์ ๋ณด ์
๋ ฅ ์ฑ๊ณต';
commit;
end if;
row_cnt := cnt; -- out parameter์ ๋ณ์cnt๊ฐ ์ ์ฅ
exception
when DUP_VAL_ON_INDEX then
msg : = '์ค๋ณตํค ์กด์ฌ';
when others then
msg := '์ ์ ์๋ ์์ธ';
end;
/
(1,2,3์ ์ค๋ผํด์์ / 4,5,6์ ์๋ฐ์์ ์ํ - CallableStatement๋ฅผ ์จ์)
4. ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ ์ธ ( ํ๋ก์์ ๊ฐ ๋ด๋ณด๋ธ out parameter์ ์กด์ฌํ๋ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด)
out parameter๋ช ๊ณผ๋ ๊ด๋ จ ์์
var[iable] ๋ณ์๋ช ๋ฐ์ดํฐํ(ํฌ๊ธฐ)
var r number
var m varchar2(100)
*์๋ฐ์์ cstmt.registerOutParameter( ์ธ๋ฑ์ค, Types์ constant ); // java.sql.Types ํด๋์ค ์ฌ์ฉ
5. ์คํ
sql> exec ํ๋ก์์ ๋ช ( ๊ฐ,,, : ๋ฐ์ธ๋๋ณ์๋ช ,,, ) // ์ง์ ์คํ //out param์ ๋ค์ด๊ฐ ๊ฐ์ :์จ์
exec insert_cp_emp (์ฌ์๋ฒํธ, '์ฌ์๋ช ', '์ง๋ฌด', '์ฐ๋ด', ๋ถ์๋ฒํธ, :bind๋ณ์๋ช , :bind๋ณ์๋ช ) ;
*์๋ฐ์์ cstmt.execute();
6. ๋ฐ์ธ๋๋ณ์์ ์ ์ฅ๋ ๊ฐ ์ถ๋ ฅ (out parameter์ ๊ฐ์ด ์ ์ฅ๋จ)
print ๋ฐ์ธ๋๋ณ์๋ช
*์๋ฐ์์ cstmt.getXxx(์ธ๋ฑ์ค);
*CallableStatement
-์๋ฐ์์ Procedure๋ฅผ ์คํํ๊ธฐ ์ํด ์ ๊ณตํ๋ interface
-PreparedStatement์ ์์ ์ธํฐํ์ด์ค (PreparedStatement์ Statement๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ)
์ฌ์ฉ๋ฒ)
1. CallableStatement๋ฅผ Connection์์ ์ป๊ธฐ
CallableStatement cstmt = con.prepareCall( "{ call ํ๋ก์์ ๋ช (?,?,?) }" );
bind๋ณ์์ ์ฌ์ฉ
2. ๋ฐ์ธ๋ ๋ณ์์ ๊ฐ ํ ๋น (procedure์ ๋งค๊ฐ๋ณ์๋ 2๊ฐ)
- in parameter: ์ธ๋ถ ๊ฐ์ procedure ๋ด๋ถ๋ก ์ ๋ฌํ๊ธฐ/๋ฐ๊ธฐ ์ํ ๋งค๊ฐ๋ณ์
PreparedStatement์ ๊ฐ์ ์ค์ ํ๋ ์ฝ๋ ๊ทธ๋๋ก
-์ ์: cstmt.setInt(์ธ๋ฑ์ค,๊ฐ) // ๋ถ๋ชจ ๋ฉ์๋๋ฅผ ์, ๋ถ๋ชจ์ ๋งค๊ฐ๋ณ์๋ช ์ ์ฌ์ฉ - out parameter: procedure ๋ด๋ถ์ ๊ฐ์ procedure ์ธ๋ถ๋ก ๋ด๋ณด๋ด๊ธฐ ์ํ ๋งค๊ฐ๋ณ์
SQL์ ๋ฐ์ธ๋ ๋ณ์๊ฐ ํ์ํจ (์๋ฐ์์ ์ ์ธํด์ผํจ) > out parameter๋ฅผ ๋ฑ๋กํ์ฌ ์ฌ์ฉ
cstmt.registerOutParameter( ์ธ๋ฑ์ค, Types์ constant );
// Types: ํน์ DBMS์ ๊ท์๋์ง ์๋ ๊ณตํต ๋ฐ์ดํฐํ์ ์ ์ํ ํด๋์ค
Number๋ ์์(์ค๋ผํด์๋ง ์กด์ฌํ๋ ๋ฐ์ดํฐํ) >> NUMERIC (์์์ ๋ฐ์ดํฐํ)
Varchar2๋ ์ค๋ผํด์๋ง ์กด์ฌ >> VARCHAR (์์์ ๋ฐ์ดํฐํ)
ex) Oracle์ Number๊ฐ out parameter์ธ ๊ฒฝ์ฐ
cstmt.registerOutParameter( ์ธ๋ฑ์ค, Types.NUMERIC );
ex) Oracle์ Varchar2๊ฐ out parameter์ธ ๊ฒฝ์ฐ
cstmt.registerOutParameter( ์ธ๋ฑ์ค, Types.VARCHAR );
3. procedure ์คํ
cstmt.execute();
4. out parameter์ ์ ์ฅ๋ ๊ฐ์ ๋ฐ๊ธฐ
๋ณ์ = cstmt.getXxx( ์ธ๋ฑ์ค );
5. ๋ณ์๋ฅผ ์ฌ์ฉ (์ถ๋ ฅ,์ฐ์ฐ,,)
์ฌ์ฉ๋ฒ)
3.ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด ์ป๊ธฐ
CallableStatement cstmt=con.prepareCall(“{ call ํ๋ก์์ ๋ช (?,?,?, ? ,? ,? ,?) }”);
//in parameter 5๊ฐ, out parameter 2๊ฐ
CallableStatement cstmt=con.prepareCall(“{ call insert_cp_emp(?,?,?, ? ,? ,? ,?) }”);
4. ๋ฐ์ธ๋๋ณ์์ ๊ฐ ์ค์
- in parameter ( ๋ถ๋ชจ์ธ PreparedStatement์ method๋ฅผ ์ฌ์ฉ)
cstmt.setInt(1, empno );
cstmt.setString( 2, ename );
cstmt.setInt(3, job);
cstmt.setInt(4, sal );
cstmt.setInt(5, deptno ); - out parameter : oracle bind ๋ณ์๊ฐ ํ์( var ๋ณ์๋ช
๋ฐ์ดํฐํ(ํฌ๊ธฐ )
cstmt.registerOutParameter( 6, Types.NUMERIC );
cstmt.registerOutParameter( 7, Types.VARCHAR );
5. ํ๋ก์์ ์คํ ( ๋ถ๋ชจ ์ธํฐํ์ด์ค์ธ PreparedStatement์ ์คํ method๋ฅผ ํธ์ถ)
cstmt.execute();
6. Oracle์ bind๋ณ์ (out parameter) ์ ์ ์ฅ๋ ๊ฐ ๋ฐ๊ธฐ ( cstmt.getXxx( out parameter์ ์ธ๋ฑ์ค) )
int cnt=cstmt.getInt(out paramaeter ์ธ๋ฑ์ค);
String msg=cstmt.getString(out paramaeter ์ธ๋ฑ์ค);
int row_cnt=cstmt.getInt(6);
String msg=cstmt.getString(7); // ์ค๋ผํด์์ ์ค๋น๋ ๋ฉ์์ง > view์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง
public class UseInsertCpEmp {
public ResultVO insertCpEmp(cpEmpVO ceVO) throws SQLException {
// ๋งค๊ฐ๋ณ์์ ๊ฐ์ํ ์ํด VO๋ก ๋ฃ์ด์ค
//procedure ์ํ ํ ๋ฐํ๋๋ out parameter๊ฐ๋ค์ ์ ์ฅํจ
ResultVO rVO = new ResultVO();
DbConnection db = DbConnection.getInstance();
Connection con = null;
CallableStatement cstmt = null;
try {
// 1.
// 2.
con = db.getConn();
// 3.
//procedure๋ฅผ ์ฐ๋ฉด ์๋ฐ์์๋ ์ฟผ๋ฆฌ๋ฌธ์ด ์์
//con์์ callableStatement ์ป๊ธฐ (ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด)
cstmt = con.prepareCall("{call insert_cp_emp(?,?,?,?)}");
// 4.๋ฐ์ธ๋ ๋ณ์์ ๊ฐ ํ ๋น
// in param(procedure ๋ด๋ถ๋ก ๊ฐ ์ ๋ฌ)
cstmt.setInt(1, ceVO.getEmpno());
cstmt.setString(2, ceVO.getEname());
// out param (procedure ์ธ๋ถ๋ก ๊ฐ ์ ๋ฌ)
// row_cnt out number(์ํ๋ ํ์), msg out varchar2(๋ฉ์์ง)
cstmt.registerOutParameter(3, Types.NUMERIC);
cstmt.registerOutParameter(4, Types.VARCHAR);
// 5.procedure ์คํ
cstmt.execute();
// 6. out parameter์ ์ ์ฅ๋ ๊ฐ ๋ฐ์์ ์ฌ์ฉํ๊ธฐ
int cnt = cstmt.getInt(3);
String msg = cstmt.getString(4);
rVO.setCnt(cnt);
rVO.setMsg(msg);
} finally {
// 7.์ฐ๊ฒฐ ๋๊ธฐ
db.dbClose(null, cstmt, con);
} // end finally
return rVO;
}// insertCpEmp
public static void main(String[] args) {
//VO ์์ฑ
cpEmpVO ceVO = new cpEmpVO(1112, "๋ฐoo");
UseInsertCpEmp uice = new UseInsertCpEmp();
try {
//VO ๋ฃ์ด procedure ํธ์ถ ๋ฐ ์ํ
ResultVO rVO = uice.insertCpEmp(ceVO);
System.out.println(rVO.getCnt() + "๊ฑด ์ถ๊ฐ");
System.out.println(rVO.getMsg());
} catch (SQLException e) {
e.printStackTrace();
} // end catch
}// main
}//class