使用"BEGIN"关键字不当

17 浏览
0 Comments

使用"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"时,期望出现以下之一: ; <标识符> <双引号限定标识符>

也许这只是一个我忽略的小错误?

0
0 Comments

在上述代码中,出现了"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语句的末尾添加分号,我们可以修复这个错误。

0
0 Comments

问题出现的原因是在使用IF NOT EXISTS时忘记了THEN关键字。解决方法是在BEGIN之前添加THEN关键字。

根据给出的stackoverflow.com上的类似情况,我们可以看到没有使用THEN关键字。

你在IF NOT EXISTS中使用了IF,所以你需要一个与之配对的THEN。你应该在出现错误的BEGIN之前的一行添加THEN

_SNOW,这个stackoverflow问题是关于MSSQL语法的,但你在这里使用的是PL/SQL。

0
0 Comments

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代码的语法正确性。

0