create or replace package pkg_test 
as
type cur_test is ref cursor; -- 定義一個cursor的type
end pkg_test;
/
create or replace procedure p_test
(
v_cur out pkg_test.cur_test
)
as
v_sql varchar2(100); -- 
begin
v_sql := 'select a1,a2 from test';
OPEN v_cur FOR v_sql; --
exception
when others then 
DBMS_OUTPUT.PUT_LINE('Error ---------------' || sqlcode || ' : ' || sqlerrm ); 
end p_test;
/
Java程式:
……
CallableStatement call = conn.prepareCall("{ call p_test(?) }");
call.registerOutParameter(1, OracleTypes.CURSOR);// 註冊out參數的SQL數據類型
call.execute();
ResultSet rs=(ResultSet)call.getObject(1);// 取得得數据結果集合
while(rs.next())
……

解决方案 »

  1.   

    create or replace package pkg_test 
    as
    type cur_test is ref cursor; -- 定義一個cursor的type
    end pkg_test;
    /
    create or replace procedure p_test
    (
    v_cur out pkg_test.cur_test
    )
    as
    v_sql varchar2(100); -- 
    begin
    v_sql := 'select a1,a2 from test';
    OPEN v_cur FOR v_sql; --
    exception
    when others then 
    DBMS_OUTPUT.PUT_LINE('Error ---------------' || sqlcode || ' : ' || sqlerrm ); 
    end p_test;
    /
    Java程式:
    ……
    CallableStatement call = conn.prepareCall("{ call p_test(?) }");
    call.registerOutParameter(1, OracleTypes.CURSOR);// 註冊out參數的SQL數據類型
    call.execute();
    ResultSet rs=(ResultSet)call.getObject(1);// 取得得數据結果集合
    while(rs.next())
    ……
      

  2.   

    谢谢 jiezhi(Niu),
    为什么要先定义一个package?
    我是想通过在dotnet中调用,取得查询的结果集DataTable
    在调用过程中我怎么确定v_cur 的数据类型?
      

  3.   

    不一定要定义一个package,你要是不怕麻烦的话,你可以定义一些变量,用loop将值fetch进去。
      

  4.   

    在oracle里面返回結果集就是這樣的用法,否則不行。
    你看一下dotnet的幫助,看從存儲過程接收結果集是怎么做的。
      

  5.   

    我看了一些oracle有关游标的文档,结构都是这样的:
    declare
    .....定义游标
    begin
         open ...
         fetch...
         close...
    end;
    我不明白的就是怎么接受结果集,谢谢楼上两位,我先看看dotnet的帮助。
      

  6.   

    http://expert.csdn.net/Expert/topic/2258/2258592.xml?temp=3.443545E-02
    http://expert.csdn.net/Expert/topic/2038/2038049.xml?temp=.6874658
      

  7.   

    to jiezhi(Niu):
    能说一下你在java下怎么调用过程p_test,
    并且怎么获取返回值v_cur的?