2007年7月10日 星期二

Java 如何利用 oracle procedure 查詢取得 ResultSet 或單一字串

這裡先不管 Java 搭配 procedure 恰不恰當, 只是提供語法給大家參考


Oracle 版本:10g 或 9i
JDBC 版本:10.2.0.1.0 ( 在此應用上 10.1.0.2.0 版本連 9i 的可以, 但連 10g 的有問題 )

Procedure 語法
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE PROCEDURE PRO_RETURN_RS(
in_n in a.f_1%type
, out_rs out sys_refcursor
)
AS
BEGIN
open out_rs for
SELECT f_1,f_2 FROM a WHERE f_1>in_n ;
END;
/
這裡須要有一個 out 的參數, 型態是 sys_refcursor , 用來將資料集傳出,
9i 以前必須自行宣告一個 cursor 型態,
到了 9i 後已有提供一個可以直接用的 sys_refcursor 型態了

Java 呼叫 procedure 回傳 ResultSet 的語法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection cn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:sid","uid","pwd"
);

//取得 ResultSet
CallableStatement call = cn.prepareCall(
"{call pro_return_rs(?,?)}"
);
call.setInt(1,1);
call.registerOutParameter(
2, oracle.jdbc.driver.OracleTypes.CURSOR
);
call.execute();
ResultSet rs = (ResultSet) call.getObject(2);
while(rs.next()){
System.out.println(
rs.getInt("f_1")+","+rs.getString("f_2")
);
}

cn.close();

同樣的, 若是要用 procedure 傳出字串, 則可以參考以下語法

Procedure 語法
1
2
3
4
5
6
7
8
9
CREATE OR REPLACE PROCEDURE PRO_RETURN_STRING(
in_n in number
,out_s out varchar2
)
AS
BEGIN
SELECT f_2 into out_s FROM a WHERE f_1=in_n ;
END;
/

Java 語法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection cn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:sid","uid","pwd"
);

//取得 String
CallableStatement call = cn.prepareCall(
"{call pro_return_string(?,?)}"
);
call.setInt(1,1);
call.registerOutParameter(2, OracleTypes.VARCHAR);
call.execute();
String s = (String) call.getObject(2);
out.println(s);

cn.close();


--關鍵字--
{java procedure}{java procedure 取得回傳 resultset}{java 呼叫 procedure}

沒有留言:

張貼留言

廣告訊息會被我刪除