来自过程的 REF 游标 PL/SQL

REF Cursor from Procedure PL/SQL

我正在尝试对 PL/SQL 包进行故障排除。我找到了一个类似的例子来解释我的问题,因为我是学习 PL/SQL 以及游标如何与过程一起工作的新手。

例如:

CREATE OR REPLACE PROCEDURE emp_by_job (
    p_job           VARCHAR2,
    p_emp_refcur    IN OUT SYS_REFCURSOR
)
IS
BEGIN
    OPEN p_emp_refcur FOR SELECT empno, ename FROM emp WHERE job = p_job;
END;

在此我看到 p_job 被定义为 VARCHAR2。然后 SQL 从 EMP 中选择作业 = p_job。我们定义的所有 p_job 都是 VARCHAR2,没有映射到任何地方的字段。游标是怎么知道job=p_job干什么的,p_job的值从哪里来?

谢谢!

程序在编译时不会任何事情,它需要called/invoked。 p_job 的值将在调用过程时传递。在下面的示例中,emp_by_job 是从匿名 pl/sql 块调用的,其参数 p_job 的值为 'MANAGER'.

koen>CREATE OR REPLACE PROCEDURE emp_by_job (
  2      p_job           VARCHAR2,
  3      p_emp_refcur    IN OUT SYS_REFCURSOR
  4  )
  5  IS
  6  BEGIN
  7      OPEN p_emp_refcur FOR SELECT empno, ename FROM emp WHERE job = p_job;
  8  END;
  9* /

Procedure EMP_BY_JOB compiled

koen>set serveroutput on size 999999
koen>DECLARE
  2    TYPE emp_t IS REF CURSOR;
  3    l_emp emp_t;
  4    l_emprow emp%ROWTYPE;
  5  BEGIN
  6    emp_by_job(p_job => 'MANAGER',p_emp_refcur => l_emp);
  7     LOOP
  8        FETCH
  9           l_emp
 10        INTO
 11           l_emprow.empno,
 12           l_emprow.ename;
 13        EXIT
 14     WHEN l_emp%notfound;
 15        dbms_output.put_line(l_emprow.empno || ' ' || l_emprow.ename);
 16     END LOOP;
 17  END;
 18* /
7698 BLAKE
7782 CLARK
7566 JONES


PL/SQL procedure successfully completed.

koen>