2017-09-18 16 views
0

하나의 프로 시저에서 테이블에서 가져올 값 목록과 두 번째 프로 시저로 전달할 값 목록이 필요합니다. 예 : A.prc에서 테이블에서 데이터를 가져와야합니다. B.prcA.prc에 가져온 데이터를 인쇄해야합니다.두 개의 plsql 프로 시저를 작성하고 싶습니다. 한 프로 시저에서 데이터 가져 오기 및 두 번째 프로 시저에서 인쇄

감사의 말

P. [오류] PLS-00306 (17 : 4) : PLS-00306 : 잘못된 번호 또는 인수의 종류에 sys PRIV와 두꺼비와 DB로 오라클 11g를 사용하여 중화 인민 공화국의

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

오류를 작성하는 '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-00,597 (6 : 15) : PLS-00597 : 식 'EMP_TAB'목록으로의이>는 잘못된 유형 [오류]의 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 매개 변수를 작동 방법에 대한 또 다른 모습을 가지고하는 것이 좋습니다 것입니다. 그러나 그것은 완전히 다른 주제가 될 것입니다. 예를 들어
: 지금까지 시도 무엇

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

잘 작동합니다! 그러나 제 강사는 커서를 두 번째 절차로 전달해야합니다. 그래서 그것은 나를위한 해결책이 아닙니다. 귀하의 제안에 감사드립니다. –