一般是通过写程序来实现游标返回集合的功能。
chanet(牧师)在第二期csdn电子杂志上有例子。
有关csdn电子杂志的链接:
http://emag.csdn.net/

解决方案 »

  1.   

    oralce的存储过程想返回记录集给应用程序调用,必须借助借助包和游标.
    第一部:定义包头
    CREATE OR REPLACE PACKAGE PACKAGE_TEST
    AS
    TYPE T_CURSOR IS REF CURSOR;  --定义一个游标指针
    PROCEDURE GetBasic
    (
        p_name IN varchar,
        cur_Basic OUT T_CURSOR  --定义一个输出参数,该参数的类型是上面定义的那个游标指针,该指针指向一个记录集
    );
    END;第二步:定义包体,包体内容就是存储过程,该过程完成查询数据库的功能
    CREATE OR REPLACE PACKAGE BODY PACKAGE_TEST
    AS
    PROCEDURE GetBasic
    (
        p_name IN varchar,
        cur_Basic OUT T_CURSOR
    )
    AS
    BEGIN
        open cur_Basic for
        select * from basic where name=p_name;  
    END;
    END;我是在asp.net里面调用的,例子如下:
    第三步:调用程序
    //返回记录集
    OracleConnection myConnection = new OracleConnection("User ID=community;Password=community;Data Source=fornet179");  //连接数据库
    myConnection.Open(); //打开连接
    OracleCommand myCommand = new OracleCommand("PACKAGE_TEST.GetBasic", myConnection);  //设置命令对象类型为存储过程
    myCommand.CommandType = CommandType.StoredProcedure;

    //输入参数
    OracleParameter Inpara = new OracleParameter("p_name",OracleType.VarChar,15); //第一个参数为输入参数名,第二个参数为类型,第三个参数为参数长度
    Inpara.Direction = System.Data.ParameterDirection.Input;
    myCommand.Parameters.Add(Inpara); 
    Inpara.Value = "a";  //传递参数值 //输出参数
    OracleParameter Outpara = new OracleParameter("cur_Basic",OracleType.Cursor); 
    Outpara.Direction = System.Data.ParameterDirection.Output;
    myCommand.Parameters.Add(Outpara); //添加参数类型,长度定义

    //用DataGrid显示返回的记录集
    OracleDataAdapter da = new OracleDataAdapter(myCommand);
    DataSet ds = new DataSet(); 
    da.Fill(ds); 
    DataGrid1.DataSource=ds.Tables[0].DefaultView;
    DataGrid1.DataBind();
    myConnection.Close();
    这个程序运行后就在界面上用datagrid显示存储过程中查出来并返回的记录集,不知道这个功能是不是你想要的。
      

  2.   

    lqlling(水晶百合) 
    不是我要的,我想要的是不在直接用游标返回一个数据库里存储的表。而是想要返回在存储过程里定义的集合类型的数据。
      

  3.   

    nowait(独行天涯路) 
    你说的csdn电子杂志早看过了,你是说这篇吧:利用游标返回数据集两则 - Delphi & VB
    不对,也不是我想要的。那也只是用游标返回数据库中的数据。
      

  4.   

    游标就像一个指针,它始终指向单条记录或空,每一次读取可以让它指向下一条记录,逐个读取。
    只能读取记录,不能返回集合。
    再说你想这样用的目的何在,怎么会产生这种思路?
    PL/SQL中的表类型专门用来处理集合数据,就像一个数组,但比数组功能强大,你有没有考虑过使用。
      

  5.   

    可以考虑用动态的sql来实现
    sql:='select ...';
    open currsor for sql using &XXXX
      

  6.   

    skystar99047(天星) 
    表类型能象游标一样,当在程序中执行存储程,就能返回一个数据集吗?
      

  7.   

    create type t1 is varray(10) of integer;
    /
    create table tab1 (c1 t1);insert into tab1 values (t1(2,3,5));
    insert into tab1 values (t1(9345, 5634, 432453));declare
     type t2 is table of t1;
     v2 t2;
    begin
     select c1  BULK COLLECT INTO v2 from tab1;
     dbms_output.put_line(v2.count); -- prints 2
    end;
    /