【问题标题】:How to make a PL/SQL stored procedure display a table?如何使 PL/SQL 存储过程显示一个表?
【发布时间】:2020-08-13 18:21:52
【问题描述】:

假设我有一个名为 student 的表,它有 3 个属性,即学号、姓名和最喜欢的颜色,当我这样调用程序时:

execute favColor('RED');

输出应该是:

NAME     FAV_COLOR 
-------- -----------
MARY     RED
JANE     RED
PETER    RED
JOHN     RED

我可以提供一个示例代码来执行此操作吗?到目前为止,我只看到插入或更新记录的过程,如果过程中有选择语句,它必须有一个 into 子句,这是否意味着过程不可能显示这个输出?

【问题讨论】:

  • 这是一个简单的 SQL SELECT。为什么需要在 PL/SQL 中进行?如果您必须在 pl/sql 中执行此操作,那么您只需将 SELECT 放入游标循环中,将每一行提取到适当的局部变量中,并在每次迭代后使用 dbms_output.put_line 来显示结果。但是,您还需要注意所有 PL/SQL 都在数据库内部执行。 dbms_output 只是写入缓冲区,由客户端决定是否读取、处理和显示该缓冲区。因此,dbms_output 的使用并不真正适合“生产”代码。

标签: oracle stored-procedures plsql sqlplus


【解决方案1】:

因为我没有你的桌子,所以我会用 Scott's 来代替颜色。

样本数据:

SQL> select ename, job from emp order by job, ename;

ENAME      JOB
---------- ---------
FORD       ANALYST
SCOTT      ANALYST
ADAMS      CLERK
JAMES      CLERK
MILLER     CLERK
SMITH      CLERK
BLAKE      MANAGER
CLARK      MANAGER
JONES      MANAGER
KING       PRESIDENT
ALLEN      SALESMAN
MARTIN     SALESMAN
TURNER     SALESMAN
WARD       SALESMAN

14 rows selected.

程序将返回具有特定工作的员工:

SQL> create or replace procedure favJob (par_job in varchar2, par_rc out sys_refcursor)
  2  is
  3  begin
  4    open par_rc for
  5      select ename, job
  6      from emp
  7      where job = par_job
  8      order by ename;
  9  end;
 10  /

Procedure created.

测试:

SQL> var rc refcursor
SQL> exec favJob('MANAGER', :rc);

PL/SQL procedure successfully completed.

SQL> print rc

ENAME      JOB
---------- ---------
BLAKE      MANAGER
CLARK      MANAGER
JONES      MANAGER

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多