【问题标题】:Using "BEGIN" keyword improperly不正确地使用“BEGIN”关键字
【发布时间】:2017-10-05 22:12:23
【问题描述】:

我在下面的代码中遇到错误。我在问题所在添加了一个错误<------

错误消息说应该是THEN,但是当我使用THEN 时,它说应该是BEGIN

Error(27,6): PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:     then and or The symbol "then" was substituted for "BEGIN" to continue. 
Error(30,6): PLS-00103: Encountered the symbol "END" when expecting one of the following:     , ; 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, 'The new password must be different from the previous password');
      RETURN;
  END IF;
    
  IF NOT EXISTS
                (
                  SELECT ISOUID 
                  FROM OLDUSERPASSWORDS 
                  WHERE ISOUID=curIsoUserUID
                )
     
     BEGIN           <------------ Error is here
        INSERT INTO OLDUSERPASSWORDS(ISOUID, DATECREATE, DATELASTCHANGE, CURRENTPASS, OLDPASS) 
        VALUES(curUserID, userDateCreated, SYSDATE, newUserPwd, oldUserPwd)
     END;
       

/*raise_application_error(-20000, 'TEST');*/
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 command not properly ended
Error(31,7): PLS-00103: Encountered the symbol "IF" when expecting one of the following:     ; <an identifier> <a double-quoted delimited-identifier> 

也许这只是我遗漏的一个小错误?

【问题讨论】:

  • 如果其中一个答案解决了您的问题,请不要忘记将其标记为已接受,让社区知道此问题已解决。

标签: sql oracle plsql


【解决方案1】:

IF THEN ELSE 的 PL/SQL 语法错误

正确的语法是:

IF condition THEN
  statements
END IF;

你的代码是有效的:

IF condition THEN
  BEGIN
    statements
  END;

已更正

IF NOT EXISTS
(
    SELECT ISOUID 
    FROM OLDUSERPASSWORDS 
    WHERE ISOUID=curIsoUserUID
)
THEN

    BEGIN           <------------ Error is NOT here
        INSERT INTO OLDUSERPASSWORDS(ISOUID, DATECREATE, DATELASTCHANGE, CURRENTPASS, OLDPASS) 
        VALUES(curUserID, userDateCreated, SYSDATE, newUserPwd, oldUserPwd);
    END;
END IF;

【讨论】:

    【解决方案2】:

    您遇到了第一个错误,因为您需要在 BEGIN 块之前添加一个 THEN 子句以使 ID 语句的语法完整且正确。

    你得到第二个错误:

    错误(30,7):PL/SQL:ORA-00933:SQL 命令未正确结束

    因为您还没有完成您的 INSERT 语句。用分号结束它应该可以解决这个错误。

       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; 
    

    【讨论】:

      【解决方案3】:

      您忘记了BEGIN 之前的THEN,这与IF NOT EXISTS 一致。

      【讨论】:

      • 我不确定 then 应该在哪里?看着这种类似的情况,有没有THEN? stackoverflow.com/questions/20971680/…
      • 你在IF NOT EXISTS 中有一个IF,所以你需要一个THEN 来配合它。您应该在错误所在的BEGIN 之前的行上有一个THEN
      • @MOR_SNOW, that stackoverflow issue 用于 MSSQL 语法,但您在这里使用的是 PL/SQL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 2018-04-08
      • 2014-09-25
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多