我想写两个 plsql 程序。在一个过程中获取数据并从第二个过程中打印出来
I want to write two plsql procedures. Get data in one procedure and print it from the second procedure
我需要在一个过程中从 table 中获取一个值列表,然后将这些值传递给第二个过程。
对于前。在 A.prc
中,我需要从 table 中获取数据,在 B.prc
中,我需要打印在 A.prc
中获取的数据。
提前致谢
P.S。 : 使用 Oracle 11g 作为具有 sys priv 和 Toad 的数据库来编写 prc 的
CREATE OR REPLACE PROCEDURE P1(
EMPNO OUT EMP.EMPNO%type,
ENAME OUT EMP.ENAME%type,
DEPTNO OUT EMP.DEPTNO%type)
AS
C_EMP SYS_REFCURSOR;
C_EM VARCHAR2(200);
BEGIN
C_EM:='SELECT EMPNO,ENAME,DEPTNO FROM EMP';
OPEN C_EMP FOR C_EM;
LOOP
FETCH C_EMP into EMPNO,ENAME,DEPTNO;
EXIT WHEN C_EMP%notfound;
END LOOP;
P2(C_EMP);
CLOSE C_EMP;
END;
/
CREATE OR REPLACE PROCEDURE P2(e_EMP SYS_REFCURSOR) AS
BEGIN
LOOP
FETCH e_EMP INTO E_EMPNO,E_ENAME,E_DEPTNO;
EXIT WHEN e_EMP%NOTFOUND;
END LOOP;
CLOSE e_EMP;
END;
/
Error : [Error] PLS-00306 (17: 4): PLS-00306: wrong number or types of
arguments in call to 'P2'
更新 1:还需要在没有游标的情况下使用关联数组来执行此操作。
这是 assignment/homework 的一部分。
用数组试过这个:
CREATE OR REPLACE PROCEDURE P1
AS
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
BEGIN
SELECT * INTO emp_tab FROM emp;
END;
/
[Error] PLS-00597 (6: 15): PLS-00597: expression 'EMP_TAB' in the INTO list is >of wrong type
[Error] ORA-00904 (6: 23): PL/SQL: ORA-00904: : invalid identifier
你走在正确的轨道上,但我认为它可以做得更简单一点。
我希望我的示例能让您了解如何解决它。
例如:
CREATE OR REPLACE PROCEDURE P2 (nId IN NUMBER, vName IN VARCHAR2)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Output nId: ' || nId || ' vName: ' || vName);
END;
/
CREATE OR REPLACE PROCEDURE P1
AS
CURSOR c1 AS
SELECT Id, Name FROM TableA;
BEGIN
FOR r1 IN c1 LOOP
P2(nId => r1.Id, vName => r1.Name);
END LOOP;
END;
/
我还建议再看一下 IN
和 OUT
参数的工作原理,因为您使用它们的方式不对。但这将是一个完全不同的话题。 :-)
要将光标行传递给过程,您可以发送记录:
例如:
CREATE OR REPLACE PROCEDURE P2 (r1 IN TableA%ROWTYPE)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Output nId: ' || r1.nId || ' vName: ' || r1.vName);
END;
/
CREATE OR REPLACE PROCEDURE P1
AS
CURSOR c1 AS
SELECT Id, Name FROM TableA;
BEGIN
FOR r1 IN c1 LOOP
P2(r1 => r1);
END LOOP;
END;
/
我需要在一个过程中从 table 中获取一个值列表,然后将这些值传递给第二个过程。
对于前。在 A.prc
中,我需要从 table 中获取数据,在 B.prc
中,我需要打印在 A.prc
中获取的数据。
提前致谢
P.S。 : 使用 Oracle 11g 作为具有 sys priv 和 Toad 的数据库来编写 prc 的
CREATE OR REPLACE PROCEDURE P1(
EMPNO OUT EMP.EMPNO%type,
ENAME OUT EMP.ENAME%type,
DEPTNO OUT EMP.DEPTNO%type)
AS
C_EMP SYS_REFCURSOR;
C_EM VARCHAR2(200);
BEGIN
C_EM:='SELECT EMPNO,ENAME,DEPTNO FROM EMP';
OPEN C_EMP FOR C_EM;
LOOP
FETCH C_EMP into EMPNO,ENAME,DEPTNO;
EXIT WHEN C_EMP%notfound;
END LOOP;
P2(C_EMP);
CLOSE C_EMP;
END;
/
CREATE OR REPLACE PROCEDURE P2(e_EMP SYS_REFCURSOR) AS
BEGIN
LOOP
FETCH e_EMP INTO E_EMPNO,E_ENAME,E_DEPTNO;
EXIT WHEN e_EMP%NOTFOUND;
END LOOP;
CLOSE e_EMP;
END;
/
Error : [Error] PLS-00306 (17: 4): PLS-00306: wrong number or types of arguments in call to 'P2'
更新 1:还需要在没有游标的情况下使用关联数组来执行此操作。 这是 assignment/homework 的一部分。 用数组试过这个:
CREATE OR REPLACE PROCEDURE P1
AS
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
BEGIN
SELECT * INTO emp_tab FROM emp;
END;
/
[Error] PLS-00597 (6: 15): PLS-00597: expression 'EMP_TAB' in the INTO list is >of wrong type [Error] ORA-00904 (6: 23): PL/SQL: ORA-00904: : invalid identifier
你走在正确的轨道上,但我认为它可以做得更简单一点。
我希望我的示例能让您了解如何解决它。
例如:
CREATE OR REPLACE PROCEDURE P2 (nId IN NUMBER, vName IN VARCHAR2)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Output nId: ' || nId || ' vName: ' || vName);
END;
/
CREATE OR REPLACE PROCEDURE P1
AS
CURSOR c1 AS
SELECT Id, Name FROM TableA;
BEGIN
FOR r1 IN c1 LOOP
P2(nId => r1.Id, vName => r1.Name);
END LOOP;
END;
/
我还建议再看一下 IN
和 OUT
参数的工作原理,因为您使用它们的方式不对。但这将是一个完全不同的话题。 :-)
要将光标行传递给过程,您可以发送记录:
例如:
CREATE OR REPLACE PROCEDURE P2 (r1 IN TableA%ROWTYPE)
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('Output nId: ' || r1.nId || ' vName: ' || r1.vName);
END;
/
CREATE OR REPLACE PROCEDURE P1
AS
CURSOR c1 AS
SELECT Id, Name FROM TableA;
BEGIN
FOR r1 IN c1 LOOP
P2(r1 => r1);
END LOOP;
END;
/