Oracle中的一个过程可以在开始和结束块内部和内部块中具有普通的Select *语句


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

相关内容

最新更新