使用"BEGIN"关键字不当
使用"BEGIN"关键字不当
下面的代码中出现了一个错误。我在问题所在处添加了一个错误标记<------
。
错误信息显示期望出现一个THEN
,但当我使用THEN
时,它又说期望出现一个BEGIN
。
Error(27,6): PLS-00103: 遇到符号"BEGIN"时,期望出现以下之一: then and or 符号"then"被替换为"BEGIN"以继续。 Error(30,6): PLS-00103: 遇到符号"END"时,期望出现以下之一: , ; return returning
我做错了什么?
create or replace PROCEDURE "sp_updateUserPassword"(newUserPwd IN VARCHAR2, curIsoUserUID IN NUMBER) IS curUserID NUMBER; userDateCreated DATE; oldUserPwd VARCHAR2(255); BEGIN SELECT ISOUID INTO curUserID FROM ISOUSERS WHERE ISOUID=curIsoUserUID; SELECT DATECREATE INTO userDateCreated FROM ISOUSERS WHERE ISOUID=curIsoUserUID; SELECT PASSWORD INTO oldUserPwd FROM ISOUSERS WHERE ISOUID=curIsoUserUID; IF(newUserPwd = oldUserPwd) THEN raise_application_error(-20000, '新密码必须与之前的密码不同'); RETURN; END IF; IF NOT EXISTS ( SELECT ISOUID FROM OLDUSERPASSWORDS WHERE ISOUID=curIsoUserUID ) BEGIN <------------ 错误出现在这里 INSERT INTO OLDUSERPASSWORDS(ISOUID, DATECREATE, DATELASTCHANGE, CURRENTPASS, OLDPASS) VALUES(curUserID, userDateCreated, SYSDATE, newUserPwd, oldUserPwd) END; /*raise_application_error(-20000, '测试');*/ END "sp_updateUserPassword";
更新
修正了代码,现在看起来像这样:
IF NOT EXISTS ( SELECT ISOUID FROM OLDUSERPASSWORDS WHERE ISOUID=curIsoUserUID ) THEN BEGIN INSERT INTO OLDUSERPASSWORDS(ISOUID, DATECREATE, DATELASTCHANGE, CURRENTPASS, OLDPASS) VALUES(curUserID, userDateCreated, SYSDATE, newUserPwd, oldUserPwd) END; END IF;
我得到了这个错误:
Error(30,7): PL/SQL: ORA-00933: SQL命令结束不正确 Error(31,7): PLS-00103: 遇到符号"IF"时,期望出现以下之一: ; <标识符> <双引号限定标识符>
也许这只是一个我忽略的小错误?
在上述代码中,出现了"Using "BEGIN" keyword improperly"的问题。这个问题的原因是在IF语句中,使用了BEGIN关键字,但没有正确地添加THEN子句来完整和正确地编写ID语句的语法。
要解决这个问题,我们需要在BEGIN关键字之前添加一个THEN子句。修改后的代码如下:
IF NOT EXISTS ( SELECT ISOUID FROM OLDUSERPASSWORDS WHERE ISOUID=curIsoUserUID ) THEN THEN BEGIN INSERT INTO OLDUSERPASSWORDS(ISOUID, DATECREATE, DATELASTCHANGE, CURRENTPASS, OLDPASS) VALUES(curUserID, userDateCreated, SYSDATE, newUserPwd, oldUserPwd); END; END IF;
修改后的代码中,我们在IF语句中添加了THEN子句,然后在BEGIN关键字之前添加了THEN关键字。这样就解决了"Using "BEGIN" keyword improperly"的问题。
此外,还有一个错误:
Error(30,7): PL/SQL: ORA-00933: SQL command not properly ended
这是因为你没有完成INSERT语句。解决这个错误的方法是在INSERT语句的末尾添加一个分号来终止它。修改后的代码如下:
IF NOT EXISTS ( SELECT ISOUID FROM OLDUSERPASSWORDS WHERE ISOUID=curIsoUserUID ) THEN THEN BEGIN INSERT INTO OLDUSERPASSWORDS(ISOUID, DATECREATE, DATELASTCHANGE, CURRENTPASS, OLDPASS) VALUES(curUserID, userDateCreated, SYSDATE, newUserPwd, oldUserPwd); END; END IF;
通过在INSERT语句的末尾添加分号,我们可以修复这个错误。
问题出现的原因是在使用IF NOT EXISTS
时忘记了THEN
关键字。解决方法是在BEGIN
之前添加THEN
关键字。
根据给出的stackoverflow.com上的类似情况,我们可以看到没有使用THEN
关键字。
你在IF NOT EXISTS
中使用了IF
,所以你需要一个与之配对的THEN
。你应该在出现错误的BEGIN
之前的一行添加THEN
。
_SNOW,这个stackoverflow问题是关于MSSQL语法的,但你在这里使用的是PL/SQL。
PL/SQL语法错误(Using "BEGIN" keyword improperly)是因为在IF THEN ELSE语句中使用了错误的语法。正确的语法是使用END IF来结束IF语句的代码块,而错误的语法是使用了BEGIN和END来定义代码块。
为了解决这个问题,需要将错误的代码块替换为正确的代码块。正确的代码块应该使用END IF来结束IF语句,而不是使用BEGIN和END。
以下是经过更正的代码示例:
IF NOT EXISTS
(
SELECT ISOUID
FROM OLDUSERPASSWORDS
WHERE ISOUID=curIsoUserUID
)
THEN
-- BEGIN <------------ 错误不在这里
INSERT INTO OLDUSERPASSWORDS(ISOUID, DATECREATE, DATELASTCHANGE, CURRENTPASS, OLDPASS)
VALUES(curUserID, userDateCreated, SYSDATE, newUserPwd, oldUserPwd);
-- END;
END IF;
通过将错误的BEGIN和END代码块替换为正确的END IF语句,可以解决这个问题。
这样就可以避免使用BEGIN关键字不当的问题,确保PL/SQL代码的语法正确性。