create procedure
return(val_id int)
is
begin
select *
from emp
where emp_id = val_id;
end
no,在甲骨文中,您无法运行普通的选择语句,不支持它。
您可以在许多其他RDBMS中执行此操作,例如,在MySQL中,以这种方式起作用:
A.4.14。MySQL 5.5存储的例程返回结果集吗?
存储过程可以,但是存储的功能不能。如果您执行 在存储过程中的普通选择,返回结果集 直接向客户。您需要使用MySQL 4.1(或更高) 客户/服务器协议可以正常工作。这意味着,例如, 在PHP中,您需要使用MySQLI扩展名而不是旧的mysql 扩展。
换句话说,如果您在过程中运行普通的选择语句,则MySQL会自动创建结果集,然后将其传递给呼叫者客户端。
在甲骨文
CREATE OR REPLACE PROCEDURE test22( val_id int, cur OUT sys_refcursor )
IS
BEGIN
open cur for select EMPNO, ENAME
from emp
where empno = val_id;
END;
/
呼叫者必须从参数检索光标,并以明确的方式处理它,没有任何"隐式自动化",例如(在SQL-Plus或SQL-Developer中):
var ppp refcursor
exec test22( 7654, :ppp );
print ppp
EMPNO ENAME
---------- ----------
7654 MARTIN
但是从Oracle 12.1c开始,有隐式语句结果功能可用,这使得可以模拟此行为:
隐式语句结果
在Oracle数据库12C之前,PL/SQL存储 子程序从SQL查询中返回的结果集,通过 OUT REF CURSOR参数和调用的客户端程序 子程序必须明确与这些参数结合以接收 结果集。
与Oracle数据库12C一样,PL/SQL存储的子程序可以返回查询 使用PL/SQL软件包DBMS_SQL隐含地向其客户端结果 而不是退出参数参数。这种技术使得很容易 迁移的应用程序依靠查询结果的隐式回报 从存储的子程序从第三方数据库到Oracle数据库。 有关更多信息,请参见" dbms_sql.return_result过程",并参见 " dbms_sql.get_next_result过程"。
在Oracle 12c上您可以做:
CREATE OR REPLACE PROCEDURE test22( val_id int )
IS
cur sys_refcursor;
BEGIN
open cur for select EMPNO, ENAME
from emp
where empno = val_id;
DBMS_SQL.RETURN_RESULT( cur, true );
END;
/
和在客户端中(SQL/Plus,SQL-Developer,在Java中,在C#等)您只需调用此过程,并且将自动检索结果集:
exec test22( 7654 );
PL/SQL procedure successfully completed.
ResultSet #1
EMPNO ENAME
---------- ----------
7654 MARTIN
您甚至可以将多个结果集返回客户端,一个示例:
CREATE OR REPLACE PROCEDURE test22( val_id int )
IS
cur sys_refcursor;
cur2 sys_refcursor;
cur3 sys_refcursor;
BEGIN
open cur for select EMPNO, ENAME
from emp
where empno = val_id;
DBMS_SQL.RETURN_RESULT( cur, true );
open cur2 for select ENAME, sal, deptno
from emp
where empno = val_id;
DBMS_SQL.RETURN_RESULT( cur2, true );
open cur3 for select ENAME, mgr, sal, deptno, hiredate
from emp
where empno = val_id;
DBMS_SQL.RETURN_RESULT( cur3, true );
END;
/
exec test22( 7654 );
PL/SQL procedure successfully completed.
ResultSet #1
EMPNO ENAME
---------- ----------
7654 MARTIN
ResultSet #2
ENAME SAL DEPTNO
---------- ---------- ----------
MARTIN 1250 30
ResultSet #3
ENAME MGR SAL DEPTNO HIREDATE
---------- ---------- ---------- ---------- ----------------
MARTIN 7698 1250 30 1981/09/28 00:00