来自过程的 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>
我正在尝试对 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>