【问题标题】:PL/SQL Stored Procedure - return records from a tablePL/SQL 存储过程 - 从表中返回记录
【发布时间】:2020-04-24 02:59:35
【问题描述】:

我对做 SQL 工作很陌生。我想知道如何在 PL/SQL 的存储过程中返回 select 语句。

到目前为止我的理解(很少)是我应该将返回的数据放在一个表中,并将表中的数据分配给一个引用游标。加载完毕后,通过 REF 光标循环并返回数据?

实际上,将其转换为存储过程的代码已经让我完全失去了在我的用例中看到的几个例子。任何帮助表示赞赏。

提前非常感谢:)

【问题讨论】:

  • 我正在使用 ORACLE DBMS :)
  • Oracle 的哪个版本?
  • 使用 oracle apex 11.2 以上版本。

标签: oracle stored-procedures plsql


【解决方案1】:

这里有一个例子:过程只有一个 - OUT - 参数,它是一个引用:

SQL> create or replace procedure p_test (par_rc out sys_refcursor)
  2  is
  3  begin
  4    open par_rc for select deptno, dname, loc from dept;
  5  end;
  6  /

Procedure created.

为了调用这样的过程,您需要将结果存储到某个东西中。为此,我将声明一个变量(在 SQL*Plus 中,这是我用于此示例的工具)并使用 begin-end 块调用该过程,并提供变量名称作为其参数:

SQL> var l_rc refcursor;
SQL>
SQL> begin
  2    p_test (:l_rc);
  3  end;
  4  /

PL/SQL procedure successfully completed.

打印结果:

SQL> print l_rc

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL>

可能还有其他选择,这取决于您实际在做什么。

【讨论】:

    【解决方案2】:

    通常存储过程用于对数据库中的数据进行操作,而函数用于返回值或数据。如果您只是想在存储过程中使用 select 语句,那么您会想要使用游标,它是您在过程开始时像任何其他变量一样声明的东西,然后在存储过程中隐式或显式打开程序代码。

    隐式游标示例:

    declare
      cursor sample_cur is  --this can be your select statement
        select sysdate as today from dual;
    
    begin
      for rec in sample_cur loop
         -- step by step for each record you return in your cursor
         dbms_output.put_line(rec.today);
      end loop;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      相关资源
      最近更新 更多