2017-09-18 68 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

這工作得很好!但是,我的講師需要我將光標傳遞給第二個過程。所以這不是我的解決方案。感謝您的建議。 –

相關問題