oracle存储过程返回一个结果集

存储过程是没有返回值的,只是在参数列表中使用in,out类型参数来区分输入变量参数和输出参数,在sqlplus中,我们可以进行打印输出。
关于输出变量的类型,其实简单点可以是字符型,数字型,复杂点可以是结果集,任意自定义类型。
而函数必须有返回值,所以在这篇博客讲的存储过程返回值是针对输出参数的。

返回一个数字型

create or replace procedure hbk_out(result out number) is
begin
	result:=100;
end;

调用我们可以如下

SQL> set serveroutput on
SQL> declare
  2  abc number;
  3  begin
  4  hbk_out(abc);
  5  dbms_output.put_line(abc);
  6  end;
  7  /
100

也可以使用sqlplus命令variable定义变量,然后使用print打印变量的值。(个人推荐的方法)

SQL> variable zll number;
SQL> execute hbk_out(:zll);

PL/SQL procedure successfully completed.

SQL> print zll;

       ZLL
----------
       100

存储过程返回一个结果集

同理,我们只需要让out参数的类型变成游标类型,更进一步,我们还可以自定义类型,如游标指针
定义包头

create or replace package hbk_return_result as
	type type_cursor is ref cursor;--定义游标指针,这里为一种新的类型
	procedure getAll(p in out type_cursor);
end hbk_return_result;

包体实现

create or replace package body hbk_return_result as
	procedure getAll(p in out type_cursor) as
	begin
		open p for select * from T1;
	end;
end;

调用

SQL> variable result refcursor
SQL> execute hbk_return_result.getAll(:result);

PL/SQL procedure successfully completed.

SQL> print result;

NAME		     CITY
-------------------- --------------------
huangbaokang	     nankang
zhanglulu	     ganzhou
huangbaokang	     beijing


使用函数返回结果集

原理大同小异,让函数返回自定义的游标类型即可。

create or replace function fun_return_res
return hbk_return_result.type_cursor is
p hbk_return_result.type_cursor;--定义游标变量
begin
	open p for select * from T1;
	return p;--返回游标变量
end;

var是variable的简写,exec为execute命令的简写,给变量赋值。

SQL> var fun_result refcursor
SQL> exec :fun_result:=fun_return_res();

PL/SQL procedure successfully completed.

SQL> print fun_result

NAME		     CITY
-------------------- --------------------
huangbaokang	     nankang
zhanglulu	     ganzhou
huangbaokang	     beijing

你可能感兴趣的:(存储过程,oracle)