2012-10-31 138 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; 

我寫過上面的程序。 下面是PL/SQL塊上面的程序調用,PLSQL中使用ORACLE DB的程序

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; 

它的發現沒有數據返回我的錯誤,但是當我運行查詢分開我得到的輸出。我無法弄清楚什麼是錯的。我是否正確編寫了過程塊,並且在PL/SQL塊中傳遞的參數是否正確?

+0

如果你的程序沒有做任何插入/更新/刪除,那麼爲什麼不使用函數呢? – user75ponic

+0

一切工作正常,除了輸出值不被打印......輸出行被打印即完成狀態和註冊日期是但ENROL_DATE和COMPL_STATUS沒有值。我也通過查詢進行了交叉檢查,並使用相同的輸入參數返回了我的輸出值。雖然我不確定,但我認爲問題在某個地方傳遞或檢索輸出參數。 – Pravin

+0

爲什麼你將2009年的價值轉化爲期限和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你有第三名buth,你把它叫做第二名。以及 (COURSEOFFERING.CO_TERMNUMBER%TYPE,COURSEOFFERING.CO_TERMNUMBER%TYPE)類型是如何聲明的?

+0

我聲明瞭與指定表格列相同類型的所有字段。 – Pravin

+0

Ind參數切換 – elrado

+0

還是不行!!! :-( – Pravin

1

當您的ABC過程中的select語句沒有返回任何行時,將引發NO_DATA_FOUND異常,並且您的存儲過程的執行將被暫停。爲了避免這種行爲,您需要在存儲過程中添加EXCEPTION部分來捕獲異常並做出適當的反應。爲此存儲過程的執行部分可能:

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等於C.C_TITLE = CO_TITLE,這是不是neccessarily你想要什麼。

嘗試C.C_TITLE LIKE '%'||CO_TITLE||'%'

+0

Cool dude .......... yippe ...經過這麼多的奮鬥後,ohh男人終於得到了輸出!非常感謝你通配符是罪魁禍首.....但是我使用了TRIM函數,它應該給我結果?也許是 – Pravin

+0

。也許不會。這取決於你在修剪什麼和如何修剪。沒有看到實際的代碼和數據一起看不出來。 –