Oracle 10g 程序编译错误

Posted

技术标签:

【中文标题】Oracle 10g 程序编译错误【英文标题】:Compilation Errors in Procedure of Oracle 10g 【发布时间】:2019-03-05 11:38:48 【问题描述】:

我在编译这个函数时收到以下错误:

PROCEDURE HAR.REPORT_INCOME_PROC PLS-00103 的编译错误: 预期以下之一时遇到符号“”

我已经尝试用谷歌搜索,但我不能怪我......

CREATE OR REPLACE PROCEDURE REPORT_INCOME_PROC IS

BEGIN
  DELETE FROM HAR.REPORT_INCOME;
  INSERT INTO HAR.REPORT_INCOME RI
    (RI.INCOME,
     RI.AREA,
     RI.INCOME_TYPE,
     RI.DATA_DATE,
     RI.CREATE_DATE,
     RI.UPDATE_DATE)
    SELECT SUM(YD.HJJE) DRSR, 
           MDYS.JYDQ SYB, 
           1,
           TRUNC(YD.KDSJ) RQ, 
           (select sysdate from dual) XZSJ,
           (select sysdate from dual) XGSJ
      FROM HYDATA.LD_YD YD 
      LEFT JOIN HYDATA.LD_KHXX KHXX
        ON YD.TYRBH = KHXX.KHBH 
      LEFT JOIN HYDATA.LD_GS GS 
        ON YD.QYDZBH = GS.GSBH 
      LEFT JOIN HAR.REPORT_JY_MDYS MDYS 
        ON YD.QYDZBH = MDYS.GSBH 
     WHERE YD.KDSJ >= TRUNC(ADD_MONTHS(SYSDATE, -12), 'yy')
       AND (YD.YDZT != 5) 
       AND (YD.CYRQZ != '20000000000000000001' OR YD.CYRQZ IS NULL) 
       AND (KHXX.KHLB != 4 OR KHXX.KHLB IS NULL)
       AND (GS.GSJC NOT LIKE '%F%' OR GS.GSJC IS NULL) 
     GROUP BY TRUNC(YD.KDSJ), MDYS.JYDQ
     ORDER BY MDYS.JYDQ ASC, TRUNC(YD.KDSJ) DESC; 
COMMIT;
END;

这是错误

Error: PLS-00103: Encountered the symbol "" when expecting one of the
following:
          begin function package pragma procedure subtype type use
          <an identifier> <a double-quoted delimited-identifier> form
          current cursor external language Line: 1

【问题讨论】:

这是你的真实代码吗?它应该工作。请复制真实代码。 (select sysdate from dual) 没用。就做sysdate AS XZSJ 可能order by 是有罪的。这里不需要。删除它。 在程序中提交是个坏主意。如果您稍后进行回滚,您可能会遇到一些意外。 非常感谢,我会根据建议改进我的代码 【参考方案1】:

您好,我认为您在执行 DML 语句时需要在 PLSQL BLOCK 上使用 EXECUTE IMMEDIATE。

试试这个:

CREATE OR REPLACE PROCEDURE REPORT_INCOME_PROC IS

BEGIN

  EXECUTE IMMEDIATE 'DELETE FROM HAR.REPORT_INCOME';
  EXECUTE IMMEDIATE 'INSERT INTO HAR.REPORT_INCOME RI <the rest of your codes>';

END;

【讨论】:

好的,我试试看。谢谢!(^_^) 当然,另一方面,您必须在字符串上添加另一个单引号。例如AND (YD.CYRQZ != ''20000000000000000001'' OR YD.CYRQZ IS NULL) .. 还请考虑以前的 cmets 来优化您的查询,例如删除 ORDER BY 等。

以上是关于Oracle 10g 程序编译错误的主要内容,如果未能解决你的问题,请参考以下文章

如何重新编译使用 Oracle 10g 的 Wrap 实用程序加密的无效 PLSQL 包?

Solaris 10下Qt编译Oracle 10g驱动

限制 Oracle 创建编译错误程序

编译过程时出现oracle错误

oracle过程异常编译错误

Pro*Fortran 可以在 windows 上连接到 Oracle 10g 吗?