2012-10-31 6 views
0
CREATE OR REPLACE PROCEDURE ABC (REG_NO IN CO_ENROLMENT.S_REGNO%TYPE, 
            TERM  IN COURSEOFFERING.CO_TERMNUMBER%TYPE, 
            YEAR  IN COURSEOFFERING.CO_YEAR%TYPE, 
            CO_TITLE IN COURSE.C_TITLE%TYPE, 
            EN_DATE OUT CO_ENROLMENT.COE_ENROLDATE%TYPE, 
            COM_ST OUT CO_ENROLMENT.COE_COMPLETIONSTATUS%TYPE) 

AS 
BEGIN 
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
    INTO COM_ST, EN_DATE 
    FROM COURSEOFFERING O 
    INNER JOIN COURSE C 
      ON C.C_ID = O.C_ID 
    INNER JOIN CO_ENROLMENT M 
      ON M.CO_ID = O.CO_ID 
    WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
END ABC; 

나는 위의 절차를 기록했다. 다음은ORACLE DB를 사용하는 PLSQL의 절차

DECLARE 
    COMPL_STATUS CO_ENROLMENT.COE_COMPLETIONSTATUS%TYPE; 
    ENROL_DATE  CO_ENROLMENT.COE_ENROLDATE%TYPE; 
BEGIN 
    ABC (44444444, 2009, 2, 'PLSQL Programming', 
     EN_DATE => enrol_date, COM_ST =>compl_status); 
    DBMS_OUTPUT.PUT_LINE ('STUDENT COMPLETION STATUS AND ENROLMENT DATE IS ' 
         || ENROL_DATE 
         || ' ' 
         || compl_status); 
END; 

그것은 데이터를 찾을 수 없음으로 나에게 오류를 반환합니다,하지만 난 쿼리를 실행할 때 별도로 I 출력을 얻을, 위의 절차를 호출하는 PL/SQL 블록입니다. 나는 틀린 것을 알아낼 수 없었다. 프로 시저 블록을 올바르게 작성했는데 PL/SQL 블록에 전달 된 매개 변수가 맞습니까?

+0

프로 시저가 삽입/업데이트/삭제를 수행하지 않으면 대신 함수를 사용하지 않는 이유는 무엇입니까? – user75ponic

+0

출력 값이 출력되지 않는다는 것을 제외하고는 모든 것이 정상적으로 작동합니다 ...... 출력 라인이 인쇄됩니다. 즉, 프로그램 완료 상태 및 등록 날짜는 ENROL_DATE 및 COMPL_STATUS에 대한 값은 없습니다. 나는 또한 그냥 쿼리와 교차 확인하고 동일한 입력 매개 변수를 사용하여 출력 값을 반환했습니다. 문제는 확실하지 않지만 출력 매개 변수를 전달하거나 검색하는 데 문제가 있다고 생각합니다. – Pravin

+0

왜 2009 년 값을 2 년으로, 2 년으로 전달합니까? 확실히 이러한 매개 변수는 반대가되어야합니다. 마지막 매개 변수에 사용하는 것처럼 항상 명명 된 매개 변수 표기법을 사용하면 도움이 될 것 같습니다. –

답변

0

을보십시오. 당신은 올바른 순서로 매개 변수를 지정하거나 명명 된 매개 변수 표기법을 사용해야 즉

ABC (44444444, 2, 2009, 'PLSQL Programming', enrol_date, compl_status); 

또는

ABC (REG_NO => 44444444, YEAR => 2009, TERM => 2, 
    CO_TITLE => 'PLSQL Programming', 
    EN_DATE => enrol_date, COM_ST =>compl_status); 
당신은 매개 변수 표기법을 이름을 사용하는 경우 다른 순서로 매개 변수를 지정할 수 있음을 알 수

(또는 매개 변수에 DEFAULT 값이있는 경우 전혀 표시되지 않습니다).

1

proc에서는 3 위를 유지하지만 2 위를 차지합니다. 그리고 유형은 어떻게됩니까 (COURSEOFFERING.CO_TERMNUMBER % TYPE, COURSEOFFERING.CO_TERMNUMBER % TYPE)이 (가) 선언 되었습니까?

+0

모든 필드가 지정된 테이블의 열의 유형과 동일한 유형으로 선언되었습니다. – Pravin

+0

Ind는 무엇을 위해 매개 변수 스위칭을 여전히 – elrado

+0

작동하지 않습니다! :-( – Pravin

1

ABC 프로 시저의 select 문이 행을 반환하지 않으면 NO_DATA_FOUND 예외가 발생하고 저장 프로 시저의 실행이 중지됩니다. 이러한 동작을 피하려면 저장 프로 시저에 EXCEPTION 섹션을 추가하여 예외를 catch하고 적절히 대응해야합니다.

BEGIN 
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
    INTO COM_ST, EN_DATE 
    FROM COURSEOFFERING O 
    INNER JOIN COURSE C 
      ON C.C_ID = O.C_ID 
    INNER JOIN CO_ENROLMENT M 
      ON M.CO_ID = O.CO_ID 
    WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN DBMS_OUTPUT.PUT_LINE('No data found') -- for example 
END ABC 

또는 select 문은 예외가 발생하더라도 계속 진행하려는 경우 중첩 된 BEGIN .. END 블록으로 select 문을 둘러싸 수 있습니다이를 위해 저장 프로 시저의 실행 부분이 보일 수 있습니다.

BEGIN 
    -- some code before 
    BEGIN  
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
     INTO COM_ST, EN_DATE 
     FROM COURSEOFFERING O 
     INNER JOIN COURSE C 
       ON C.C_ID = O.C_ID 
     INNER JOIN CO_ENROLMENT M 
       ON M.CO_ID = O.CO_ID 
     WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
    EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN DBMS_OUTPUT.PUT_LINE('No data found') -- for example 
    END; 
    -- some code after 
END ABC 
1

아마도 프로 시저 쿼리에 와일드 카드가 없습니다. 그들없이

16:02:06 [email protected]> select * from dual where 'abc' like 'ab'; 

no rows selected              


16:02:18 [email protected]> select * from dual where 'abc' like 'ab%'; 

D                 
-                 
X                 

, C.C_TITLE LIKE CO_TITLE 당신이 원하는 neccessarily하지 않은, C.C_TITLE = CO_TITLE 같다.

당신은 잘못 저장 프로 시저를 호출하고 C.C_TITLE LIKE '%'||CO_TITLE||'%'

+0

멋진 젠체하는 .......... yippe ... 투쟁의 순전히 마침내 결과를 얻었다! 고맙습니다. 너무 많은 와일드 카드가 범인이었습니다 .....하지만 TRIM 기능을 사용 했더니 결과가 나왔나요? – Pravin

+0

어쩌면. 아마. 그것은 무엇을 어떻게 트리밍 했느냐에 달려 있습니다. 나는 실제 코드를 데이터와 함께 보지 않고는 말할 수 없다. –