2013-12-20 50 views
0

我已經成功地創建了以下存儲過程:Oracle存儲過程INOUT參數問題 - 得到了解決 - 錯字錯誤

CREATE OR REPLACE PROCEDURE FIRSTPROC (ID1 IN VARHAR2, ID2 IN NUMBER) 
AS 
CURSOR FIRST_CUR AS 
SELECT id2val 
FROM 
WHERE id1val = ID1; 

BEGIN 
    DBMS_OUTPUT.PUT_LINE(ID1); 
    OPEN FIRST_CUR; 
    FETCH FIRST_CUR INTO ID2; 
    IF FIRST_CUR%NOTFOUND THEN 
    ID2 := 0; 
    END IF; 

END 

在執行,我傳遞價值23 ID1變量,並顯示值在DBMS_OUTPUT.PUT_LINE語句中。值存在表中,但我沒有得到結果

但是,如果我硬編碼存儲過程中的23我得到的價值。弄糊塗了。上面我缺少的東西。

CREATE OR REPLACE PROCEDURE FIRSTPROC (ID1 IN VARHAR2, ID2 IN NUMBER) 
AS 
CURSOR FIRST_CUR AS 
SELECT id2val 
FROM 
WHERE id1val = 23; 

BEGIN 
    DBMS_OUTPUT.PUT_LINE(ID1); 
    OPEN FIRST_CUR; 
    FETCH FIRST_CUR INTO ID2; 
    IF FIRST_CUR%NOTFOUND THEN 
    ID2 := 0; 
    END IF; 

END 
+0

有沒有在表中的列'ID1'?只想確認一下。 其他方面,你的程序很好。 –

回答

0

首先,您已將ID2聲明爲IN參數,所以結果不會返回。您需要將ID2聲明爲IN OUT或OUT參數。 (順便說一句,你提供的代碼甚至不會編譯,因爲「VARHAR2」是一個錯字)。第二個程序也是這樣,所以我不明白這是怎麼可能的,所以你必須有其他的事情。

1

的一些問題:

  1. VARHAR2我們一個錯字,應該是VARCHAR2
    • 您可改爲指定數據類型以使用table_name.column_name%TYPE來引用相應的表列。
  2. 程序不輸出任何東西 - 你需要改變IN參數之一的OUT(或IN OUT參數)。
  3. 您的查詢未指定表名稱。您可以使用SELECT ... INTO ...而不是CURSOR

事情是這樣的:

CREATE OR REPLACE PROCEDURE FIRSTPROC (
    ID1 IN table_name.id1val%TYPE, 
    ID2 OUT table_name.id2val%TYPE 
) 
AS 
BEGIN 
    DBMS_OUTPUT.PUT_LINE(ID1); 
    SELECT id2val 
    INTO ID2 
    FROM table_name 
    WHERE id1val = ID1; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    ID2 := 0; -- Or you could use NULL 
    WHEN TOO_MANY_ROWS THEN 
    ID2 := 0; -- Or you could use NULL 
END; 
/