2017-09-18 29 views
0

我需要从一个过程的表中获取值的列表,然后将值传递给第二个过程。 例如。在A.prc我需要从表中获取数据,并在B.prc我需要打印我在A.prc中获取的数据。我想写两个plsql程序。在一个过程中获取数据并从第二个过程中打印出来

在此先感谢

P.S. :使用Oracle 11g作为DB与SYS PRIV和蟾蜍写中华人民共和国

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; 
    /

错误:[错误] PLS-00306(17:4):PLS-00306:错误的号码或类型的 参数打电话给'P2'

更新1:还需要这样做,没有游标,有关联数组。 这是作业/作业的一部分。 与阵列尝试这样做:

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; 
    /

[错误] PLS-00597(6:15):PLS-00597:表达式 'EMP_TAB' 在INTO列表>错误类型 [错误]的ORA-00904(6:23):PL/SQL:ORA-00904:无效的标识符

+0

你尝试过这么远吗? –

+0

我尝试过使用游标。我会将我的代码添加到说明 –

回答

0

你在正确的轨道上,但是我认为它可以做一点点简单的多。
我希望我的例子能给你一个如何解决它的想法。
例如:

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; 
/

我也建议对INOUT参数是如何工作的,becasue你是在一个错误的方式使用他们再看一看。但那将是一个完全不同的话题。 :-)

要通过光标线的过程中,您可以发送记录:
例如:

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; 
/
+0

谢谢!我会尝试并更新。你还可以帮助我做同样的事情,而不使用游标,但与关联数组? –

+0

我更喜欢在游标中。 :-) – Tenzin

+0

这工作得很好!但是,我的讲师需要我将光标传递给第二个过程。所以这不是我的解决方案。感谢您的建议。 –

相关问题