【问题标题】:unexpected token error in plsql procedureplsql 过程中出现意外的令牌错误
【发布时间】:2020-07-01 07:45:40
【问题描述】:
CREATE PROCEDURE EPS.PROCEDURE_OTE_LTE_BIDDER_REPORT 
   (
       IN P_USERID INTEGER,
       IN P_AUCTIONID INTEGER,
       IN P_REPORT_FLAG VARCHAR(3),
       OUT O_ERROR_CODE INTEGER,
       OUT OUTPUT_MESSAGE VARCHAR(100),
       IN P_LOG_USERID INTEGER
   )
    LANGUAGE SQL 
    
P1:BEGIN ATOMIC DECLARE SQLCODE INTEGER DEFAULT 0;
    
    DECLARE V_USERID INTEGER;
    DECLARE V_AUCTIONID INTEGER;
    DECLARE V_REPORT_FLAG_TECHNOCOMMERCIALQUALIFIEDCUSTOMER VARCHAR(3);
    DECLARE V_COUNT_TECHNOCOMMERCIALQUALIFIEDCUSTOMER INTEGER;
    DECLARE V_REPORT_FLAG_SELECTIVEUSERWISETENDERREPORT VARCHAR(3);
    DECLARE V_COUNT_SELECTIVEUSERWISETENDERREPORT INTEGER;
    
    
    SELECT COUNT(*) INTO V_COUNT_TECHNOCOMMERCIALQUALIFIEDCUSTOMER FROM EPS.TECHNOCOMMERCIALQUALIFIEDCUSTOMER A 
        WHERE A.AUCTIONID=P_AUCTIONID AND A.USERID=P_USERID;
    
    
    SELECT COUNT(*) INTO V_COUNT_SELECTIVEUSERWISETENDERREPORT FROM EPS.SELECTIVEUSERWISETENDERREPORT B 
        WHERE B.AUCTIONID=P_AUCTIONID AND B.USERID=P_USERID;
    
    
    
    IF P_REPORT_FLAG = 'Y' THEN
        IF V_COUNT_TECHNOCOMMERCIALQUALIFIEDCUSTOMER < 1  THEN
            INSERT INTO EPS.TECHNOCOMMERCIALQUALIFIEDCUSTOMER (A.AUCTIONID,A.USERID,A.QUALIFIED) VALUES (P_AUCTIONID,P_USERID,'Y');
        ELSE
            SET OUTPUT_MESSEGE = 'DATA ALREADY PRESENT';
        END IF;
    ELSE 
        IF  V_COUNT_TECHNOCOMMERCIALQUALIFIEDCUSTOMER > 0  THEN
            DELETE FROM EPS.TECHNOCOMMERCIALQUALIFIEDCUSTOMER C WHERE C.AUCTIONID=P_AUCTIONID AND C.USERID=P_USERID;
        ELSE
            SET OUTPUT_MESSAGE = 'NO DATA FOUND';
        END IF;    
    END IF; 
    
    IF P_REPORT_FLAG = 'Y' THEN
        IF V_COUNT_SELECTIVEUSERWISETENDERREPORT < 1  THEN
            INSERT INTO EPS.SELECTIVEUSERWISETENDERREPORT AA 
            (   AA.AUCTIONID,
                AA.USERID,
                AA.TENDERREPORTTYPEID,
                AA.STATUS,
                AA.CREATEID,
                AA.CREATEDATE,
                AA.UPDATEID,
                AA.UPDATEDATE
            ) 
            VALUES 
            (
                P_AUCTIONID,
                P_USERID,
                103.
                'A',
                P_LOG_USERID,
                CURRENT TIMESTAMP,
                NULL,
                NULL
            );
        ELSE
            SET OUTPUT_MESSEGE = 'DATA ALREADY PRESENT';
        END IF;     
    ELSE  
        IF  V_COUNT_SELECTIVEUSERWISETENDERREPORT > 0  THEN
            DELETE FROM EPS.SELECTIVEUSERWISETENDERREPORT  CC WHERE CC.AUCTIONID=P_AUCTIONID AND CC.USERID=P_USERID;
        ELSE
            SET OUTPUT_MESSAGE = 'NO DATA FOUND';
        END IF;        
    END IF; 
    
    
 END P1 

我收到了这个错误

SQL Error [42601]: An unexpected token "END-OF-STATEMENT" was found following "Y PRESENT'".  Expected tokens may include:  "
  END IF".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.7.85
SQL Error [42601]: An unexpected token "END-OF-STATEMENT" was found following "Y PRESENT'".  Expected tokens may include:  "
  END IF".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.7.85
  An unexpected token "END-OF-STATEMENT" was found following "Y PRESENT'".  Expected tokens may include:  "
  END IF".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.7.85
  An unexpected token "END-OF-STATEMENT" was found following "Y PRESENT'".  Expected tokens may include:  "
  END IF".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.7.85

【问题讨论】:

  • 我知道 PL/SQL 但不知道 DB2。是否有 Oracle PL/SQL 仿真模式?上面的代码不是 PL/SQL,但是错误消息也不是你在 Oracle 中从该代码中得到的,所以不清楚这是什么。
  • 这是 db2 错误。你能看到 if else 条件是否正确吗?
  • P1:此处不需要 Begin,因为代码中似乎只有一个 Begin,因此只需将 P1:Begin 替换为 Begin 并将 End P1 替换为 End;并在最后添加终止符为 /(斜杠)
  • IBM DB2 中的一个 PL/SQL 过程示例是 here(尽管该文档奇怪地引用了“PL/SQL 模式”)。

标签: stored-procedures db2


【解决方案1】:

它有助于正确使用理解 SQL 的语法编辑器,并更加小心地检查您的代码。一个好的 SQL 编辑器可能会在您尝试编译之前突出显示您的错误,就像任何代码审查一样。

另外,您应该了解 ANSI SQL PL 和 Oracle PL/SQL 之间的区别。您的代码似乎使用了 ANSI SQL PL 语法,尽管您的错误可能是任何 SQL 风格的错误。

以下是您的代码中一些明显的语法错误(可能还有其他错误):

  • INSERT INTO EPS.SELECTIVEUSERWISETENDERREPORT AA 行上,AA 应省略。

  • 对于相同的插入语句,您有103.,而您可能指的是103,

  • 对于INSERT INTO EPS.TECHNOCOMMERCIALQUALIFIEDCUSTOMER (A.AUCTIONID,A.USERID,A.QUALIFIED) 行,您可能是指 INSERT INTO EPS.TECHNOCOMMERCIALQUALIFIEDCUSTOMER (AUCTIONID,USERID,QUALIFIED)

  • INSERT INTO EPS.SELECTIVEUSERWISETENDERREPORT 的行也存在同样的错误(不要限定列名)。

  • 对于以SET OUTPUT_MESSEGE = 开头的行,您的意思可能是SET OUTPUT_MESSAGE =,而其他行也存在此错字。

【讨论】:

  • 但是在解决了你说的问题后,我在这行代码中遇到了错误。 IF P_REPORT_FLAG = 'Y' THEN IF V_COUNT_TECHNOCOMMERCIALQUALIFIEDCUSTOMER
  • 不要使用 cmets 提出新问题。按照建议使用理解 SQL 的编辑器并以这种方式找出错误。
  • 对不起,我没有找到任何使用 sql 编辑器的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2021-10-13
相关资源
最近更新 更多