JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » JDBC/SQL討論區 » JDBC 應用  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
話題被移動
該話題已被移動 - browser , 2006-04-12 10:14
如果您尚不清楚該話題被移動的原因,請參考論壇規則以及本版公告或者聯系本版版主。
本主題所含的標籤
無標籤
作者 利用 oracle procedure 查詢取得 ResultSet [精華]
karry





發文: 244
積分: 2
於 2006-04-12 09:38 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
這裡先不管 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 語法
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"
  );
 
//取得 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")+"<BR>");
}
 
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
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();


karry edited on 2008-03-11 12:58
reply to postreply to post
玩Web無窮 http://enjoywebtech.blogspot.com/
作者 Re:利用 oracle procedure 查詢取得 ResultSet [Re:karry]
Yio





發文: 28
積分: 0
於 2006-05-16 09:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
您好
我也是寫了一段會接收function回傳的ResultSet的java code
但卻出現了"java.sql.SQLException: 超過最大的類型長度"的錯誤訊息
請問是為什麼呢?
謝謝。


reply to postreply to post
作者 Re:利用 oracle procedure 查詢取得 ResultSet [Re:Yio]
karry





發文: 244
積分: 2
於 2006-05-16 12:48 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Yio wrote:
您好
我也是寫了一段會接收function回傳的ResultSet的java code
但卻出現了"java.sql.SQLException: 超過最大的類型長度"的錯誤訊息
請問是為什麼呢?
謝謝。

我在試的時候也有發生過這個錯誤, 但已經不太記得是什麼原因了
也許是 JDBC 版本的問題, 因為我只記得當初版本用錯時, 就不能執行


reply to postreply to post
作者 Re:利用 oracle procedure 查詢取得 ResultSet [Re:karry]
bluemoney





發文: 3
積分: 0
於 2007-04-10 09:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Function 不可以有 DML 的語法,
也就是不可以有更改資料的SQL,
我猜應該是這樣的錯誤!


reply to postreply to post
作者 Re:利用 oracle procedure 查詢取得 ResultSet [Re:karry]
fij





發文: 47
積分: 0
於 2007-08-16 17:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
灌個水
我在這個問題上也盧了2個工作天以上
最後才看到大大這片文章
找到很多 SLOUTION都類似這個 但唯有看到這篇才知道
基本上純粹是DRIVER版本問題
很久很久以前的版 NG
10.2.0.1.0 OK
10.2.0.2 NG
10.2.0.3 OK
這篇是參數為resultset
順帶補充一下 function或procedure回傳值為resultset 的方式
http://www.onjava.com/pub/a/onjava/2003/08/13/stored_procedures.html?page=last
http://www.enterprisedt.com/publications/oracle/result_set.html
http://www.javaworld.com.tw/jute/post/view?bid=21&id=84589&tpg=1&ppg=1&sty=1&age=0#84589


fij edited on 2007-08-20 15:01
reply to postreply to post
» JWorld@TW »  JDBC/SQL討論區 » JDBC 應用

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8