๋ชฉ์ฐจ
1. 23.11.27(์)
F_JDBC08
ใด C:\JDBCStudy\JDBC08\src\com\test
ใดใด Test001.java
/* ==================================================
Test001.java
- CallableStatement ๋ฅผ ํ์ฉํ SQL ๊ตฌ๋ฌธ ์ ์ก ์ค์ต
===================================================== */
package com.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.util.Scanner;
import com.util.DBConn;
public class Test001
{
public static void main(String[] args)
{
try
{
Scanner sc = new Scanner(System.in);
Connection conn = DBConn.getConnection();
do
{
System.out.print("์ด๋ฆ ์
๋ ฅ(-1 ์ข
๋ฃ): ");
String name = sc.next();
if (name.equals("-1"))
break;
System.out.print("์ ํ๋ฒํธ ์
๋ ฅ: ");
String tel = sc.next();
if (conn != null)
{
System.out.println("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฑ๊ณต~!!!");
try
{
// ์ฟผ๋ฆฌ๋ฌธ ์ค๋น check~!!!
String sql = "{call PRC_MEMBERINSERT(?, ?)}";
// CallableStatement ์์
๊ฐ์ฒด ์์ฑ check~!!!
CallableStatement cstmt = conn.prepareCall(sql);
// ๋งค๊ฐ๋ณ์ ์ ๋ฌ
cstmt.setString(1, name);
cstmt.setString(2, tel);
int result = cstmt.executeUpdate();
if(result > 0)
System.out.println("ํ๋ก์์ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ์
๋ ฅ ์๋ฃ~!!!!");
} catch (Exception e)
{
System.out.println(e.toString());
}
}
} while (true);
DBConn.close();
System.out.println("\n๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ข
๋ฃ~!!!");
System.out.println("ํ๋ก๊ทธ๋จ ์ข
๋ฃ๋จ~!!!");
} catch (Exception e)
{
System.out.println(e.toString());
}
}
}
// ์คํ ๊ฒฐ๊ณผ
/*
์ด๋ฆ ์
๋ ฅ(-1 ์ข
๋ฃ): ๊น๋ค์ฌ
์ ํ๋ฒํธ ์
๋ ฅ: 010-1111-1111
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฑ๊ณต~!!!
ํ๋ก์์ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ์
๋ ฅ ์๋ฃ~!!!!
์ด๋ฆ ์
๋ ฅ(-1 ์ข
๋ฃ): ์ค์๊ฒฝ
์ ํ๋ฒํธ ์
๋ ฅ: 010-2222-2222
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฑ๊ณต~!!!
ํ๋ก์์ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ์
๋ ฅ ์๋ฃ~!!!!
์ด๋ฆ ์
๋ ฅ(-1 ์ข
๋ฃ): ๊น๊ฒฝํ
์ ํ๋ฒํธ ์
๋ ฅ: 010-3333-3333
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฑ๊ณต~!!!
ํ๋ก์์ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ์
๋ ฅ ์๋ฃ~!!!!
์ด๋ฆ ์
๋ ฅ(-1 ์ข
๋ฃ): ๋ฐ๋ฒ๊ตฌ
์ ํ๋ฒํธ ์
๋ ฅ: 010-4444-4444
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฑ๊ณต~!!!
ํ๋ก์์ ํธ์ถ ๋ฐ ๋ฐ์ดํฐ ์
๋ ฅ ์๋ฃ~!!!!
์ด๋ฆ ์
๋ ฅ(-1 ์ข
๋ฃ): -1
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ข
๋ฃ~!!!
ํ๋ก๊ทธ๋จ ์ข
๋ฃ๋จ~!!!
*/
ใดใด Test002.java
Project Explorer ์์์ ํด๋น ํ๋ก์ ํธ(JDBC08) ๋ง์ฐ์ค ์ฐํด๋ฆญ.
/* ==================================================
Test002.java
- CallableStatement ๋ฅผ ํ์ฉํ SQL ๊ตฌ๋ฌธ ์ ์ก ์ค์ต
===================================================== */
// CallableStatement ์ ํต์ฌ ์์
package com.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import com.util.DBConn;
import oracle.jdbc.OracleTypes;
public class Test002
{
public static void main(String[] args)
{
try
{
Connection conn = DBConn.getConnection();
if (conn != null)
{
System.out.println("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฑ๊ณต~!!!");
try
{
// ์ฟผ๋ฆฌ๋ฌธ ์ค๋น check~!!!
String sql = "{call PRC_MEMBERSELECT(?)}";
// CallableStatement ์์
๊ฐ์ฒด ์์ฑ check~!!!
CallableStatement cstmt = conn.prepareCall(sql);
// check~!!!
// ํ๋ก์์ ๋ด๋ถ์์ <sys_refcursor>๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์
// OracleTypes.CURSOR ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฑ๋ก ๊ณผ์ ์ด ํ์ํ ์ํฉ.
// 1. Project Explorer ์์์ ํด๋น ํ๋ก์ ํธ(JDBC08) ๋ง์ฐ์ค ์ฐํด๋ฆญ.
// 2. Build Path > Configure Build Path ํด๋ฆญ.
// 3. Libraries ํญ ์ ํ
// 4. ์ฐ์ธก Add External JAR ๋ฒํผ ํด๋ฆญ
// 5. <ojdbc6.jar> ํ์ผ ์ถ๊ฐ ๋ฑ๋ก(์ธ๋ถ jar ํ์ผ ์ฐ๊ฒฐ)
// 6. <import oralce.jdbc.OralceTypes;> ๊ตฌ๋ฌธ ์ถ๊ฐ ๋ฑ๋ก
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
cstmt.execute(); // **์ฐธ์กฐํ๋ ํํ์ ์ปค์๋ฅผ ์ธ๋๋ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๊ณ , ์ฐ๋ฆฌ๋ execute() ์ฌ์ฉ**
ResultSet rs = (ResultSet)cstmt.getObject(1); //**Object ํ์
์ผ๋ก ๋ฐํ**
while (rs.next())
{
String sid = rs.getString("SID");
String name = rs.getString("NAME");
String tel = rs.getString("TEL");
String str = String.format("%3s %7s %12s", sid, name, tel);
System.out.println(str);
}
rs.close();
cstmt.close();
} catch (Exception e)
{
System.out.println(e.toString());
}
}
DBConn.close();
System.out.println("\n๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ข
๋ฃ~!!!");
System.out.println("ํ๋ก๊ทธ๋จ ์ข
๋ฃ๋จ~!!!");
} catch (Exception e)
{
System.out.println(e.toString());
}
}
}
// ์คํ ๊ฒฐ๊ณผ
/*
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ฑ๊ณต~!!!
3 ๊น๋ค์ฌ 010-1111-1111
4 ์ค์๊ฒฝ 010-2222-2222
5 ๊น๊ฒฝํ 010-3333-3333
6 ๋ฐ๋ฒ๊ตฌ 010-4444-4444
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ข
๋ฃ~!!!
ํ๋ก๊ทธ๋จ ์ข
๋ฃ๋จ~!!!
*/
ใด C:\JDBCStudy\JDBC08\src\com\util
ใดใด DBConn.java
...
ใด JDBC08_scott.sql
SELECT USER
FROM DUAL;
--==>> SCOTT
SELECT *
FROM TBL_MEMBER
ORDER BY SID;
/*
1 ์ด์ค์ 010-1111-1111
2 ์ํ์ฑ 010-3333-3333
3 ๊น๋ฏผ์ง 010-4444-4444
4 ๋ฌธ์ ํ 010-5555-5555
5 ์ ํ์ธ 010-6666-6666
6 ์ ํ์ธ 010-6666-6666
7 ์ด์ค์ 010-7777-7777
*/
TRUNCATE TABLE TBL_MEMBER;
--==>> Table TBL_MEMBER์ด(๊ฐ) ์๋ ธ์ต๋๋ค.
SELECT *
FROM TBL_MEMBER
ORDER BY SID;
--==>> ์กฐํ๊ฒฐ๊ณผ ์์
DROP SEQUENCE MEMBERSEQ;
--==>> Sequence MEMBERSEQ์ด(๊ฐ) ์ญ์ ๋์์ต๋๋ค.
--โ CallableStatement ์ค์ต์ ์ํ ํ๋ก์์ ์์ฑ
-- ํ๋ก์์ ๋ช
: PRC_MEMBERINSERT
-- ํ๋ก์์ ๊ธฐ๋ฅ : TBL_MEMBER ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๋ ํ๋ก์์
CREATE OR REPLACE PROCEDURE PRC_MEMBERINSERT
( VNAME IN TBL_MEMBER.NAME%TYPE
, VTEL IN TBL_MEMBER.TEL%TYPE
)
IS
VSID TBL_MEMBER.SID%TYPE;
BEGIN
SELECT NVL(MAX(SID),0)+1 INTO VSID
FROM TBL_MEMBER;
INSERT INTO TBL_MEMBER(SID, NAME, TEL)
VALUES(VSID, VNAME, VTEL);
COMMIT;
END;
SELECT *
FROM TBL_MEMBER;
--==>>
/*
3 ๊น๋ค์ฌ 010-1111-1111
4 ์ค์๊ฒฝ 010-2222-2222
5 ๊น๊ฒฝํ 010-3333-3333
6 ๋ฐ๋ฒ๊ตฌ 010-4444-4444
*/
DELETE
FROM TBL_MEMBER;
--โ CallableStatement ์ค์ต์ ์ํ ํ๋ก์์ ์์ฑ
-- ํ๋ก์์ ๋ช
: PRC_MEMBERSELECT
-- ํ๋ก์์ ๊ธฐ๋ฅ : TBL_MEMBER ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ํ๋ก์์
-- โป <SYS_REFCURSOR> ์๋ฃํ์ ์ด์ฉํ์ฌ ์ปค์ ๋ค๋ฃจ๊ธฐ
CREATE OR REPLACE PROCEDURE PRC_MEMBERSELECT
( VRESULT OUT SYS_REFCURSOR
)
IS
-- ์ฃผ์ ๋ณ์ ์ ์ธ
-- -> ์ปค์ ์ ์ -> ์ถ๋ ฅ์ฉ ๋งค๊ฐ๋ณ์๋ก ๋์ฒด
BEGIN
OPEN VRESULT FOR
SELECT SID, NAME, TEL
FROM TBL_MEMBER
ORDER BY SID;
-- CLOSE VRESULT;
/* ์ฐธ์กฐํ๋ ํํ์ ์ปค์๋ฅผ ์ฌ์ฉํ ๋๋ ์ปค์๋ฅผ ๋ซ์ง ์๋๋ค!
์ค๋ผํด์ด ์๋, ์๋ฐ์์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
*/
-- COMMIT;
END;
--==>> Procedure PRC_MEMBERSELECT์ด(๊ฐ) ์ปดํ์ผ๋์์ต๋๋ค.
COMMIT;
--==>> ์ปค๋ฐ ์๋ฃ.
โ โ โ CallableStatement โ โ โ
/*
์ฌ์ฉ๋น๋๋ ํ์ ํ๊ฒ ๋จ์ด์ง์ง๋ง,
JDBC ์์์ ๊ฐ์ฒด์์ฑํ๊ณ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ์ฉ๋๋ก๋ ๊ผญ ํ์ํ ์ธํฐํ์ด์ค.
*/
1. CallableStatement ์ธํฐํ์ด์ค๋ ๋ชจ๋ DBMS ๋ค์ ๋ํ ํ์ค ๋ฐฉ๋ฒ์ผ๋ก
**์ ์ฅ ํ๋ก์์ (stored procedure)๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค**์ด๋ฉฐ,
ํธ์ถ์ escape ๋ฌธ๋ฒ์ผ๋ก ์์ฑ๋๋ค.
2. ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง๋ ํํ์ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํํ(๋ ๊ฐ์ง)์ด๋ฉฐ
OUT ๋งค๊ฐ๋ณ์์ ์ข
๋ฅ์ธ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๋
์ ์ฅ ํ๋ก์์ ์ ๋ํ ๋ฐํ๊ฐ์ด๋ค.
๋ ํํ ๋ชจ๋ IN ๋งค๊ฐ๋ณ์(์
๋ ฅ), OUT ๋งค๊ฐ๋ณ์(์ถ๋ ฅ), INOUT ๋งค๊ฐ๋ณ์(์
์ถ๋ ฅ)
๋ฅผ ์ํด ์ฌ์ฉ๋๋ ๋งค๊ฐ๋ณ์์ ๋ณ์ ๋ฒํธ๋ฅผ ๊ฐ์ง๋ฉฐ
<?>๋ ๋งค๊ฐ๋ณ์์ ์ ์ฅ ์์น๋ก ๋ํ๋ธ๋ค.
3. ํ์ ๋ฐ ๊ตฌ์กฐ
(JDBC ์์ ์ ์ฅ ํ๋ก์์ ํธ์ถ์ ์ํ ๋ฌธ๋ฒ)
๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ ์ฅ ํ๋ก์์ ํธ์ถ
{call procedure_name}
IN ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐํํ๋ ํ๋ก์์ ํธ์ถ
{call pocedure_name[(?,?, ...)]}
OUT ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐํํ๋ ํ๋ก์์ ํธ์ถ/ ๋ฐํ์๋ฃํ์ด ์กด์ฌํ๋ ํจ์ ํธ์ถ
{? = call pocedure_name[(?,?, ...)]}
4. CallableStatement ๊ฐ์ฒด ์์ฑ
CallableStatement ๊ฐ์ฒด๋ Connection ์ prepareCall() ๋ฉ์๋์ ์ํด ์์ฑ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ ๊ฐ์ ์ธ์๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ฒฐ๊ณผ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ ์ฅ ํ๋ก์์ prcDatat๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
CallableStatement cstmt = conn.prepareCall("{call prcDatat(?,?)}");
โป ๋ฌผ์ํ(<?>)์ ์์น๊ฐ IN, OUT, INOUT ๋งค๊ฐ๋ณ์ ์ค
์ด๋ค ๊ฒ์ธ๊ฐ ํ๋ ๊ฒ์ ์ ์ฅ ํ๋ก์์ prcData์ ์์กดํ๋ค.
5. IN, OUT ๋งค๊ฐ๋ณ์
CallableStatement ๊ฐ์ฒด๋ก IN ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐํํ๋ค๋ฉด ๊ฐ OUT ๋งค๊ฐ๋ณ์์ SQL ํ(Type)์ CallableStatement ๊ฐ์ฒด๋ฅผ ์คํํ ์ ์๋ ์ํ๊ฐ ๋๊ธฐ ์ ์ ๋ฑ๋ก๋์ด์ ธ์ผ ํ๋ค.
๋ง์ฝ, ์ ์ฅ ํ๋ก์์ ๊ฐ OUT ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐํํ๋ค๋ฉด ๊ฐ OUT ๋งค๊ฐ๋ณ์์ SQL ํ(Type)์ CallableStatement ๊ฐ์ฒด๋ฅผ ์คํํ ์ ์๋ ์ํ๊ฐ ๋๊ธฐ ์ ์ ๋ฑ๋ก๋์ด์ ธ์ผ ํ๋ค. ์ด๋ ๋ช ๋ช DBMS ๋ค์ด SQL ํ(Type)์ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ์ด ๋, SQL ํ(Type)์ ๋ฑ๋กํ๋ ๊ฒ์ registerOutParament() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ , SQL ๊ตฌ๋ฌธ์ด ์คํ๋์ด์ง ๋ค์์ CallableStatement ์ getXxx() ๋ฉ์๋๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๊ฒ์ํ๋ฉฐ, ์ฌ์ฉ๋๋ ์ ํํ getXxx() ๋ฉ์๋๋ ๊ทธ ๋งค๊ฐ๋ณ์๋ฅผ ์ํด ๋ฑ๋ก๋์ด์ง SQL ์ ์์ํ๋ ์๋ฐ ํ(Type)์ด๋ค. ์ฆ, registerOutParament() ๋ฉ์๋๋ SQL ํ์
์ ์ฌ์ฉํ๊ณ , getXxx() ๋ฉ์๋๋ ์ด๊ฒ์ ์๋ฐ ํ์
์ผ๋ก ์บ์คํธ(cast)ํ๋ ๊ฒ์ด๋ค.