0

我正在尝试检查输入长度,看看它是否小于 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;
/ 
4

2 回答 2

2

你说了一些看似矛盾的话:

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

你描述你正在做的事情是:

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

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

因此,如果您没有收到任何一条消息,那么您还没有完成:

set serveroutput on

在 SQL*Plus 中调用exec. 该设置默认为 off,除非您在login.sqlor中将其打开glogin.sql,因此如果您想查看dbms_output消息,则必须明确打开它。


在这种情况下,对于验证,(a)您可能也需要selectelsef 内部,部分原因是(b)如果传递的值不存在,您将得到一个 no_data_found 异常,并且(c)您可能想要如果长度小于 7,则考虑抛出异常,而不是(仅)显示消息。调用它的其他人可能都没有 serverout,或者可能正在使用没有该选项的其他客户端。

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

v_staffID staff.staffID%TYPE;

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

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

于 2013-07-20T07:22:32.813 回答
0

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

于 2013-07-20T05:21:36.130 回答