CREATE OR REPLACE PACKAGE pkg_test
AS
   TYPE myrctype IS REF CURSOR;
END pkg_test;
/
create or replace procedure taskselect(ts_id in varchar2,p_rc out pkg_test.myrctype)
as
str varchar2(50);
begin
str:='select task_name,amount from tasks where task_id='''||ts_id||'''';
open p_rc for str;
end;
/declare
v_rc pkg_test.myrctype;
tn varchar(20);
tam number(10,0);
begin
taskselect('19980001',v_rc);
fetch v_rc into tn,tam;
loop 
exit when v_rc%nofound;
dbms_output.put_line(tn||' '||tam);
fetch v_rc into tn,tam;
end loop;
end;
/

解决方案 »

  1.   

    谢谢!
    但请问我那种方法有什么错误?
    用你这种方法的话,怎样在java中得到这个返回到结果集?
      

  2.   

    java中还没试过,只像一般调用过程,但在参数out类型要把包名也写进去。
    若确定select task_name,amount into tn,tam from tasks where task_id=ts_id;只有一条记录,也可这样。create or replace procedure taskselect(ts_id in varchar2,tn out varchar2,tam out number)
    as
    begin
    select task_name,amount into tn,tam from tasks where task_id=ts_id;
    end;
    /
    declare
    tn varchar(20);
    tam number(10,0);
    begin
    taskselect('19980001',tn,tam);
    dbms_output.put_line(tn||' '||tam);
    end;
    /
      

  3.   

    我用你这种方法做过:
    SQL> create package task_search
      2  as
      3    type ta_search is ref cursor;
      4    procedure taskselect(ts_id varchar2,ts_sor out ta_search);
      5  end task_search;
      6  /程序包已创建。SQL> create package body task_search
      2  as
      3    procedure taskselect(ts_id varchar2,ts_sor out ta_search)
      4    is
      5      begin
      6      open ts_sor for
      7        select task_name,amount from tasks where task_id=ts_id;
      8    end taskselect;
      9  end task_search;
     10  /程序包主体已创建。
    创建的包和过程都成功,只是在java中调用用游标返回的结果集时出现错误,所以改用最上面的方法,返回的记录不止一条。
    主要是请教如何在java中“调用”结果集的问题。
      

  4.   

    急死了,我连英文资料都看了一大堆了,还是找不到错误。有谁有用java调用结果集的成功例子,帮帮忙呀!
      

  5.   

    java中定义
    ResultSet rstSet = null;
    rstSet = (ResultSet) call.getObject(3);call.getObject(2)为你要返回的结果CREATE OR REPLACE PACKAGE pkg_test
    AS
       TYPE myrctype IS REF CURSOR;
    END pkg_test;
    /
    create or replace procedure taskselect(ts_id in varchar2,p_rc out pkg_test.myrctype)
    as
    str varchar2(50);
    begin
    str:='select task_name,amount from tasks where task_id='''||ts_id||'''';
    open p_rc for str;
    end;
    /
      

  6.   

    这个我也试过了,我在java中调用的语句为:
    …………
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:datamy","system","pqh0720");
    …………String procedure = "{?=call task_search.taskselect(?,?)}";
    CallableStatement cstmt = conn.prepareCall(procedure);
    cstmt.registerOutParameter(2,Types.OTHER);
    cstmt.setString(1,searchTaskID);
    cstmt.execute();
    ResultSet rs=(ResultSet)cstmt.getObject(2);
    while(rs.next()){
      System.out.println(rs.getString(1));
      System.out.println(rs.getString(2));
    }
    …………
    但是还是错误,错误提示为
    javax.servlet.ServletException: [Oracle][ODBC][Ora]ORA-24334: ????????
    请问sky2003202,你调试成功了吗?能否帮我调试一下,这个问题困了我一个星期了,急呀!
      

  7.   

    String procedure = "{?=call task_search.taskselect(?,?)}";
    ->
    String strSQL  = "{call task_search.taskselect(?,?)}";
      

  8.   

    我刚调试了一下,按你的做法错误更多呀:
    javax.servlet.ServletException: [Oracle][ODBC][Ora]ORA-06550: ? 1 ?, ? 7 ?: 
    PLS-00306: ?? 'taskselect' ??????????
    ORA-06550: ? 1 ?, ? 7 ?: 
    PL/SQL: Statement ignored
    我看过资料,好像一般有输出变量的话call前都要用?=的
      

  9.   

    不会吧
    我就是这么用的你看看你是不是别的地方还有错
    CallableStatement cstmt = conn.prepareCall(procedure)这句你改了么?
      

  10.   

    cstmt= pConn.prepareCall(sqlStr);
      

  11.   

    CallableStatement cstmt = conn.prepareCall(procedure);

    cstmt= pConn.prepareCall(sqlStr);
    好像没什么不同呀?
    我改了试了还是不行,出现的错误和我上面说的一样
      

  12.   

    你把java 和sp 都给我看一下,我在看看
      

  13.   

    程序包为:
    create package task_search
    as
    type ta_search is ref cursor;
    procedure gettask(ta_id varchar2,ts_sor out ta_search);
    end task_search;
    程序包体为:
    create package body task_search
    as
    procedure gettask(ta_id varchar2,ts_sor out ta_search)
    is
    begin
    open ts_sor for
    select task_name,amount from tasks where task_id=ts_id;
    end gettask;
    end task_search;
    在jsp中的调用语句为:
    …………
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    conn = DriverManager.getConnection("jdbc:odbc:datamy","system","pqh0720");
    …………
    String sqlStr = "{call task_search.gettask(?,?)}";//按你的意思去掉了?=
    CallableStatement cstmt = conn.prepareCall(sqlStr);
    cstmt.registerOutParameter(2,Types.OTHER);
    cstmt.setString(1,searchTaskID);//searchTaskID是从表单中提交的数据
    cstmt.executeQuery();
    ResultSet rs=null;
    rs=(ResultSet)cstmt.getObject(2);
    while(rs.next()){
    System.out.println(rs.getString(1));
    }
      

  14.   

    procedure gettask(ta_id in  varchar2,ts_sor out ta_search)
    is
    begin
    open ts_sor for
     'select task_name,amount from tasks where task_id = :ta_id'
    using ta_id;
    end gettask;
    end task_search;
      

  15.   

    :-(
    试了,还是不行!
    我认为其实
    open ts_sor for
     'select task_name,amount from tasks where task_id = :ta_id';
    using ta_id;

    open ts_sor for
    select task_name,amount from tasks where task_id=ts_id;
    都是可以的。
    究竟是什么地方出了问题呢?!
      

  16.   

    没有问题呀,编译都通过了,你再试试:
    SQL> create or replace package task_search
      2  as
      3  type ta_search is ref cursor;
      4  procedure gettask(ta_id varchar2,ts_sor out ta_search);
      5  end task_search;
      6  /程序包已创建。SQL> create or replace package body task_search
      2  as
      3  procedure gettask(ta_id varchar2,ts_sor out ta_search)
      4  is
      5  begin
      6  open ts_sor for
      7  'select task_name,amount from tasks where task_id = :ta_id'
      8  using ta_id;
      9  end gettask;
     10  end task_search;
     11  /程序包主体已创建。
      

  17.   

    由于出现的错误为
    javax.servlet.ServletException: [Oracle][ODBC][Ora]ORA-24334: ????????
    我在想是不是在java中调用游标时出现的问题。因为我看到一般的JDBC Driver是用的oracle.driver,因此在注册输出变量时用的是
    cstmt.registerOutParameter(2,OracleTypes.CURSOR);
    在返回结果集时用的是
    rs=(ResultSet)cstmt.getCursor(2);
    而我用的JDBC Driver是jdbc-odbc桥,所以在注册输出变量时用的是
    cstmt.registerOutParameter(2,Types.OTHER);
    在返回结果集时用的是
    rs=(ResultSet)cstmt.getObject(2);
    不知道这个地方有没有问题?
      

  18.   

    问题解决了,改用了oracle jdbc驱动,
    String procedure = "{?=call task_search.taskselect(?,?)}";
    象sky2003202说的将这句前面的?=去掉即可