日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle调用存储过程和函数返回结果集

發布時間:2024/1/23 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle调用存储过程和函数返回结果集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

視頻課:https://edu.csdn.net/course/play/7940

在程序開發中,常用到返回結果集的存儲過程,這個在MySQL和sql server 里比較好處理,直接返回查詢結果就可以了,

但在 Oracle里面 要 out 出去,就多了一個步驟,對于不熟悉的兄弟們還得出上一頭汗:),這里我簡單介紹一下,以供參考,
?? 1??定義包
??????oracle 返回的結果集需要自定義一個 CURSOR (游標變量)性質的變量,這個要在包頭定義,所以要建立一個包,如下是包頭

Pl/sql代碼

CREATE OR REPLACE PACKAGE PAK_rstest

? IS

??? TYPE?? retcursor??? IS?? REF?? CURSOR;

?? PROCEDURE pro_read

???? (

?????? outcurse? IN OUT retcursor

???? );

?? END; -- Package spec

???? 上面是建立了一個名稱為PAK_rstest的包頭,里面定義了一個CURSOR 類型,類型名為retcursor ,有了這個定義我們就可以用他來返回結果集了,比如該包里面的 pro_read 過程就是 一個返回結果集的過程,下面是他的包體,

Pl/sql代碼

CREATE OR REPLACE PACKAGE BODY PAK_rstest IS

?? PROCEDURE pro_read

?? (

?????? outcurse? IN OUT retcursor

?? )

?? IS

?? begin

??????? OPEN outcurse FOR

???????? select * from tbl_test

??????????????? where rownum<6;

??????? return;

?? end;

?

END;

??? 這樣就定義好了一個包,這個包里面有個返回結果集的過程 pro_read
??

?2 在程序里面調用,
???? 下面就是如果在程序里面調用了,這里用Java為例子簡單介紹一下,
??? ?假設你現在已經有一個Connection??conn 對象連接上了數據庫(如何連接數據庫我這里就不詳細說了),
?? ? 則用下面的代碼調用過程,

Pl/sql代碼

?

if(conn !=null){

??? String sqlstr = "{call? PAK_SMS2_ROUTE.MO_ISSUE(?)}";

???? CallableStatement cstmt = conn.prepareCall(sqlstr);

???? cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //outcurse

???? cstmt.executeUpdate();

???? ResultSet rs = (ResultSet) cstmt.getObject(1); // 這里吧信息已經讀入rs結果集里面,剩下的大家都熟悉了吧

?? while (rs.next()) {

??????? System.out.println(rs.getString("s_date1")); //tbl_test 表里的字段名稱或是結果集的列名稱

???? System.out.println(rs.getString("s_date2"));

????? }???

???????? conn.close();

???????? conn = null;???????

}

?

? 好了到這里就可以看到返回的結果集內容了,是不是比較簡單啊,:)

?? Oracle 存儲過程返回結果集:

過程返回記錄集代碼

?

CREATE OR REPLACE PACKAGE pkg_test

AS

??? TYPE myrctype IS REF CURSOR;

?

??? PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);

END pkg_test;

?

?

CREATE OR REPLACE PACKAGE BODY pkg_test

AS

??? PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)

??? IS

?????? sqlstr?? VARCHAR2 (500);

??? BEGIN

?????? IF p_id = 0 THEN

????????? OPEN p_rc FOR

???????????? SELECT ID, NAME, sex, address, postcode, birthday

?????????????? FROM student;

?????? ELSE

????????? sqlstr :=

???????????? 'select id,name,sex,address,postcode,birthday

??????????? from student where id=:w_id';

????????? OPEN p_rc FOR sqlstr USING p_id;

?????? END IF;

??? END get;

END pkg_test;??

?

?

函數返回記錄集:
建立帶ref cursor定義的包和包體及函數:

?

函數返回記錄集代碼

CREATE OR REPLACE

package pkg_test as

/* 定義ref cursor類型

??? 不加return類型,為弱類型,允許動態sql查詢,

??? 否則為強類型,無法使用動態sql查詢;

*/

?

?? type myrctype is ref cursor;?

??

--函數申明

?? function get(intID number) return myrctype;

end pkg_test;?

?

包體代碼

?

CREATE OR REPLACE

package body pkg_test as

--函數體

??? function get(intID number) return myrctype is

????? rc myrctype;? --定義ref cursor變量

? ????sqlstr varchar2(500);

??? begin

????? if intID=0 then

???????? --靜態測試,直接用select語句直接返回結果

???????? open rc for select id,name,sex,address,postcode,birthday from

student;

????? else

???????? --動態sql賦值,用:w_id來申明該變量從外部獲得

???????? sqlstr := 'select id,name,sex,address,postcode,birthday from

student where id=:w_id';

???????? --動態測試,用sqlstr字符串返回結果,用using關鍵詞傳遞參數

???????? open rc for sqlstr using intid;

????? end if;

??

????? return rc;

??? end get;

??

end pkg_test;

?

Java調用oracle函數返回游標處理代碼

?

CallableStatement cstmt = null;

ResultSet rs = null;

try {

String callSql = "{? = call AAAAA(?)}";

cstmt = conn.prepareCall(callSql);

???

cstmt.setString(2, "userName");

cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);

cstmt.execute();

rs = (ResultSet) cstmt.getObject(1);

if (rs != null) {

?????? System.out.print("usercd");

?????? System.out.print("userName");???????????????

?????? System.out.println("EMAIL");

?????? while (rs.next()) {???????

??? System.out.print(rs.getString(1)+"?? ");

??? System.out.print(rs.getString(2)+"?? ");???????????????

??? System.out.println(rs.getString(3));

?????? }???

}

總結

以上是生活随笔為你收集整理的oracle调用存储过程和函数返回结果集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。