Oracle存储过程:返回结果集和输出参数

时间:2018-02-17 06:24:03

标签: oracle stored-procedures

Oracle存储过程具有OUT参数并返回结果集,例如

create or replace procedure foo(empId IN NUMBER, maxSalary OUT NUMBER) AS BEGIN
    select * from Employee e where e.id >=empId;
    select max(salary) into maxSalary from Employee;
END;

ERROR:

PLS-00428: an INTO clause is expected in this SELECT statement

Mysql存储过程可以返回结果集和输出参数。如何为oracle db做到这一点?

1 个答案:

答案 0 :(得分:5)

在Oracle中,如果没有INTO子句,则无法运行直接选择语句。

如果您使用的是Oracle 12c及更高版本,则可以使用REF CURSORDBMS_SQL.RETURN_RESULT

create or replace procedure foo(empId IN NUMBER, maxSalary OUT NUMBER) AS
q SYS_REFCURSOR;
 BEGIN
    OPEN q FOR select * from Employee e where e.id >=empId;
     DBMS_SQL.return_result (q); -- This will display the result
    select max(salary) into maxSalary from Employee;
END;

对于以前的版本(11g,10g),您可以将REF CURSOR作为OUT参数传递,并通过以脚本形式运行来从sqlplus或TOAD打印。

create or replace procedure foo(empId IN NUMBER, maxSalary OUT NUMBER,
   q OUT SYS_REFCURSOR) AS

     BEGIN
        OPEN q FOR select * from Employee e where e.id >=empId;
        select max(salary) into maxSalary from Employee;
    END;

在调用过程之前定义绑定变量。

VARIABLE v_empID NUMBER
VARIABLE v_maxsalary NUMBER
VARIABLE v_q REFCURSOR

EXEC :v_empID := 101
EXEC foo(:v_empID,:v_maxsalary,:v_q ) 
PRINT v_q -- This will display the result from the query.