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;
可以考虑用动态的sql来实现 sql:='select ...'; open currsor for sql using &XXXX
skystar99047(天星) 表类型能象游标一样,当在程序中执行存储程,就能返回一个数据集吗?
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; /
第一部:定义包头
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显示存储过程中查出来并返回的记录集,不知道这个功能是不是你想要的。
不是我要的,我想要的是不在直接用游标返回一个数据库里存储的表。而是想要返回在存储过程里定义的集合类型的数据。
你说的csdn电子杂志早看过了,你是说这篇吧:利用游标返回数据集两则 - Delphi & VB
不对,也不是我想要的。那也只是用游标返回数据库中的数据。
只能读取记录,不能返回集合。
再说你想这样用的目的何在,怎么会产生这种思路?
PL/SQL中的表类型专门用来处理集合数据,就像一个数组,但比数组功能强大,你有没有考虑过使用。
sql:='select ...';
open currsor for sql using &XXXX
表类型能象游标一样,当在程序中执行存储程,就能返回一个数据集吗?
/
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;
/