2013-07-31 65 views
0

我正在運行Oracle SQL開發人員,並且我有以下存儲過程。我是很新的這一點,但真的不知道爲什麼,這是行不通的:爲什麼這個基本的'Select Into'存儲過程不起作用?

CREATE OR REPLACE PROCEDURE CHECKDUPLICATE(
     username1 IN USERS.USERNAME%TYPE, 
     o_username OUT USERS.USERNAME%TYPE 
) 

IS 
BEGIN 

    SELECT USERNAME 
    INTO o_username 
    FROM USERS WHERE username1 = o_username; 

END; 

當我試圖把它叫做:

DECLARE 
    o_username USERS.USERNAME%TYPE; 
BEGIN 

    CHECKDUPLICATE('Jacklin', o_username); 

    DBMS_OUTPUT.PUT_LINE('username : ' || o_username); 

END; 

我得到的錯誤信息:

Error starting at line 1 in command: 
DECLARE 
    o_username USERS.USERNAME%TYPE; 
BEGIN 

    CHECKDUPLICATE(Jacklin, o_username); 

    DBMS_OUTPUT.PUT_LINE('username : ' || o_username); 

END; 
Error report: 
ORA-06550: line 5, column 19: 
PLS-00201: identifier 'JACKLIN' must be declared 
ORA-06550: line 5, column 4: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

必須聲明「標識符Jacklin」是什麼意思?(表格稱爲USERS,列名稱爲USERNAME)任何幫助將不勝感激

編輯**我把傑克林的報價,我現在得到這個消息:

Error report: 
ORA-01403: no data found 
ORA-06512: at "L13JAV04.CHECKDUPLICATE", line 9 
ORA-06512: at line 6 
01403. 00000 - "no data found" 
*Cause:  
*Action: 

即使傑克林它存在於數據庫中!

+0

傑克林是一個字符串。應該用單引號括起 – Noel

+0

謝謝!但是我現在收到另一個錯誤信息..錯誤報告: ORA-01403:找不到數據 ORA-06512:在 「L13JAV04.CHECKDUPLICATE」,9號線 ORA-06512:在第6行 01403. 00000 - 「找不到數據」 *原因: *行動: – DeaIss

+0

我編輯它到我原來的問題,以便於閱讀 – DeaIss

回答

3

添加例外,一旦你報價「傑克林」,這樣它作爲一個字符串,而不是一個標識符治療,您的SQL語句看起來不正確的。

SELECT USERNAME 
    INTO o_username 
    FROM USERS 
    WHERE username1 = o_username; 

我的投注是您要在WHERE子句中使用輸入參數,而不是輸出參數。

SELECT USERNAME 
    INTO o_username 
    FROM USERS 
    WHERE username1 = username; 

當你沒有做任何事情來初始化它時,檢查輸出參數的值是沒有意義的。

但是你的代碼似乎仍然沒有意義。如果返回1行以外的內容,則SELECT INTO將引發錯誤。如果你的查詢返回0行,你會得到一個NO_DATA_FOUND異常。如果您的查詢返回多於一行,則會出現TOO_MANY_ROWS例外。你的過程被命名爲CheckDuplicate,所以我猜測它的目的是檢查表中是否已經存在一個特定的用戶名,而不是試圖插入它並捕獲唯一的違反約束的錯誤。如果這是你的代碼的意圖

  • 你可能希望它是一個功能
  • 你可能不希望返回username
  • 你可能想已經返回用戶名是否的指標存在

我的猜測,因此,這是你想要的東西像

create or replace function isAvailable(p_username IN USERS.USERNAME%TYPE) 
    return Boolean 
is 
    l_username USERS.USERNAME%TYPE; 
begin 
    select username 
    into l_username 
    from users 
    where username = p_username; 
    return false; 
exception 
    when no_data_found 
    then 
    return true; 
end; 
1

您需要將傑克林放在報價單中,作爲一個字符串處理。否則解析器認爲它是一個字段名稱。

+0

我這樣做了,但我收到另一個錯誤消息(編輯到原始問題) – DeaIss

+1

請參閱Jafar的評論。你的where子句是錯誤的。 FROM USERS WHERE username1 = o_username應該替換爲FROM USERS WHERE username1 = USERNAME_FIELD_IN_TABLE(無論如何)。 –

0

本來沒有用戶通過「傑克林」的名稱這就是爲什麼它給你的錯誤。請在結束

WHEN NO_DATA_FOUND 
THEN 
......