Oracle SQL过程检查输入长度

时间:2013-07-20 05:01:50

标签: sql oracle procedure

我正在尝试检查输入长度,看它是否小于7.它应显示错误消息,但下面的代码不起作用。怎么了?

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;
/ 

2 个答案:

答案 0 :(得分:2)

你说的话似乎是矛盾的:

  

它显示[PL / SQL过程已成功完成。]但不检查我的输入是否少于7个字符。并且数据也不会更新。

你形容你正在做:

  

我将它保存在procedure1.sql下,我在sql plus中启动它。那是我的第一个电话。之后我打电话给exec prc_staffContact('100001','0000')

这些建议当你说数据没有更新时,你真正的意思是你没有从else分支获得联系号码/新联系号码消息,我认为你是假设这意味着更新也没有发生,所以它没有执行任何一个分支。但根据定义,您必须进入ifelse

所以,如果你没有收到任何一条消息,那么你还没有完成:

set serveroutput on
在调用exec之前,在SQL * Plus中

That setting is off by default,除非您在login.sqlglogin.sql中启用它,否则如果您想查看dbms_output条消息,则必须明确启用它。


在这种情况下,对于验证,(a)你可能也想在elsef`中有select,部分原因是(b)如果传递的值不存在,你将得到no_data_found异常, (c)如果长度小于7而不是(仅)显示消息,您可能需要考虑抛出异常。调用它的其他人可能没有服务器输出,或者可能使用不具有该选项的其他客户端。

您还将v_staffID定义为char(6)。除了想知道为什么不是varchar2之外,你给出它的长度意味着如果IN_staffID 7个字符或更多,select into将会得到'字符串缓冲区太小'错误。我将其声明为:

v_staffID staff.staffID%TYPE;

...以避免类似的问题,对于与表列相关的其他字段也是如此。

您的“成功”消息显示旧的联系号码,而不是新的联系号码。不确定您是否需要v_staffContact

答案 1 :(得分:0)

仔细查看您的代码。可能是您的变量类型不兼容或存储过程参数与其他变量(或表列,列的类型)不兼容。我在我的数据库中测试了你的代码,一切顺利。但可能是选择语句中的错误未找到数据,或者可能是缓冲区太小错误。希望这对你有所帮助。感谢