2013-07-20 41 views
0

我正在檢查輸入長度,看它是否小於7.它應該顯示一條錯誤消息,但下面的代碼不起作用。它出什麼問題了?檢查輸入長度的Oracle SQL過程

CREATE OR REPLACE PROCEDURE prc_staffContact(IN_staffID IN CHAR, IN_staffContact IN VARCHAR) IS 

    v_staffName VARCHAR(50); 
    v_staffID CHAR(6); 
    v_staffContact VARCHAR(11); 


BEGIN 

    SELECT s.staffName, s.staffID, s.staffContact 
    INTO v_staffName, v_staffID, v_staffContact 
    FROM staff s 
    WHERE staffID = IN_staffID; 

    IF (LENGTH(IN_staffContact) < 7) 
    THEN 
     DBMS_OUTPUT.PUT_LINE('Error. Contact number at least 7 digits.'); 
    ELSE  
     UPDATE staff 
     SET staffContact = IN_staffContact 
     WHERE staffID = IN_staffID; 

     DBMS_OUTPUT.PUT_LINE('============================================================================='); 
     DBMS_OUTPUT.PUT_LINE('The contact number of [ ' ||v_staffName || ' ] has been updated successfully.'); 
     DBMS_OUTPUT.PUT_LINE('New contact number: [ ' ||v_staffContact || ' ].'); 
     DBMS_OUTPUT.PUT_LINE('============================================================================='); 

    END IF; 

END; 
/
+0

定義「不起作用」。你有錯誤嗎?如果是這樣,有什麼錯誤?代碼是否不像您期望的那樣行事?如果是這樣,你看到了什麼行爲?你期望什麼行爲?你通過了哪些輸入程序? –

+0

該過程可以成功創建,我更新它顯示的聯繫號碼[成功完成PL/SQL過程。],但是甚至不檢查我的輸入是否少於7個字符。並且數據也不會更新。 –

+0

對不起,我不確定我的理解。你說你「更新聯繫人號碼」,我假設你運行程序並且程序運行UPDATE語句。但是,你說「數據不會更新」,這似乎意味着相反。你聲稱這個過程並不檢查你輸入的是否少於7個字符,但你沒有提供任何證據 - 你對這個過程有什麼輸入? –

回答

2

你說這似乎是一個矛盾的東西:

它顯示[PL/SQL過程已成功完成。]但即使不檢查我的輸入少於7個字符。並且數據也不會更新。

你描述你做的是:

我保存它procedure1.sql,我開始它的SQL加。那是我的第一個電話。從那以後,我打電話EXEC prc_staffContact(「100001」,「0000」)

一起那些建議時,你說的數據沒有更新,你真正的意思是你沒有得到的聯繫電話/來自else分支的新聯繫人號碼消息,並且我認爲您認爲這意味着更新不會發生,因此它不會執行任一分支。按照定義,您必須進入ifelse

所以,如果你沒有得到任何消息,那麼你有沒有做到:

set serveroutput on 

在SQL * Plus調用exec之前。 That setting is off by default,除非您在login.sqlglogin.sql中打開它,所以如果要查看dbms_output消息,則必須明確地將其打開。


在這種情況下,驗證,(a)您可能希望elsef`內select過,部分原因是(B)如果傳遞的值不存在,你會得到一個NO_DATA_FOUND異常, (c)如果長度小於7而不是(僅)顯示消息,則可能需要考慮拋出異常。其他人調用它可能沒有serverout,或者可能使用不具有該選項的其他客戶端。您還有v_staffID定義爲char(6)。除了想知道爲什麼這不是varchar2,你給它的長度意味着如果IN_staffID 7個字符或更多,select into將得到'字符串緩衝區太小'的錯誤。我聲明如下:

v_staffID staff.staffID%TYPE; 

...爲了避免這樣的問題,與同爲,涉及到表列的其它領域。

而你的'成功'信息顯示的是舊聯繫人號碼,而不是新聯繫人號碼。不知道你需要v_staffContact

0

仔細看看你的代碼。可能是您的變量類型不兼容或存儲過程參數與其他變量(或表列,列的類型)不兼容。我在我的數據庫中測試了你的代碼,所有的成功。但可能會出現錯誤未找到數據您的選擇語句,或者可能是緩衝區太小錯誤。希望這對你有所幫助。感謝