存储过程同样也可以用来返回多个结果集。如下面的oracle存储过程用游标返回两个结果集:
- create or replace procedure proAA
- (
- out_var out sys_refcursor,
- out_var2 out sys_refcursor
- )
- as
- begin
- open out_var for select * from emp;
- open out_var2 for select * from test;
- end;
这个简单的存储过程只是返回了emp和test两个表的结果集。在集算器中调用这个存储过程,接收两个结果集的程序如下:
|
A |
1 |
=connect("ora") |
2 |
=A1.proc("{call proAA(?,?)}",:101:"o":a,:101:"o":b) |
3 |
=A2(1) |
4 |
=a |
5 |
=b |
6 |
>A1.close() |
A2中用proc函数调用存储过程:=A1.proc("{call proAA(?,?)}",:101:"o":a,:101:"o":b),返回了两个结果集(序表),组成了一个序表的集合:序列,赋值给了A2。下面再详细解释一下proc函数中的参数:
SQL字符串"{call proAA(?,?)}"中包含调用存储过程的名字,问号表示SQL的参数。
:101:"o":a中定义了一个输出参数,101代表其数据类型是游标,"o"代表这个参数是输出参数。a是定义了一个变量,可以将返回的结果输出到这个变量,输出参数2。
:101:"o":b中定义了一个输出参数,101代表其数据类型是游标,"o"代表这个参数是输出参数。b是定义了一个变量,可以将返回的结果输出到这个变量。
A3单元格返回了A2单元格的第一个序表(emp表的结果集)。
A4、A5单元格分别使用A2中的输出变量a、b来获取存储过程对应的执行结果,其中a对应emp表的数据,赋值给A4,b对应test表的数据,赋值给A5。A2中的结果其实就等于A4和A5中的序表所构成的序列。