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

Posted

技术标签:

【中文标题】Oracle 存储过程:返回结果集和输出参数【英文标题】:Oracle stored procedure: return both result set and out parameters 【发布时间】:2018-07-28 01:26:16 【问题描述】:

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;

错误:

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

mysql存储过程既可以返回结果集,也可以返回out参数。 oracle db怎么做?

【问题讨论】:

【参考方案1】:

在 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.

【讨论】:

能否在SQL Server 2008 中实现相同的功能,告诉我? @WillMarcouiller,是的。 Ms Sql 允许您从存储过程中返回一个或多个数据集。请避免使用游标,这对 Sql 女士来说很慢(例如,只返回表)。在此处查看详细信息:***.com/questions/22963939/…

以上是关于Oracle 存储过程:返回结果集和输出参数的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程如何输出信息

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

oracle存储过程 中把临时表数据 返回结果集

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,

oracle存储过程如何输出结果集

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,