我正在尝试检查输入长度,看它是否小于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;
/
答案 0 :(得分:2)
你说的话似乎是矛盾的:
它显示[PL / SQL过程已成功完成。]但不检查我的输入是否少于7个字符。并且数据也不会更新。
你形容你正在做:
我将它保存在procedure1.sql下,我在sql plus中启动它。那是我的第一个电话。之后我打电话给exec prc_staffContact('100001','0000')
这些建议当你说数据没有更新时,你真正的意思是你没有从else
分支获得联系号码/新联系号码消息,我认为你是假设这意味着更新也没有发生,所以它没有执行任何一个分支。但根据定义,您必须进入if
或else
。
所以,如果你没有收到任何一条消息,那么你还没有完成:
set serveroutput on
在调用exec
之前,在SQL * Plus中。 That setting is off by default,除非您在login.sql
或glogin.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)
仔细查看您的代码。可能是您的变量类型不兼容或存储过程参数与其他变量(或表列,列的类型)不兼容。我在我的数据库中测试了你的代码,一切顺利。但可能是选择语句中的错误未找到数据,或者可能是缓冲区太小错误。希望这对你有所帮助。感谢