【问题标题】:Compilation Errors in Procedure of Oracle 10gOracle 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 是有罪的。这里不需要。删除它。
  • 在程序中提交是个坏主意。如果您稍后进行回滚,您可能会遇到一些意外。
  • 非常感谢,我会根据建议改进我的代码

标签: oracle procedure pls-00103


【解决方案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 等。
猜你喜欢
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 1970-01-01
相关资源
最近更新 更多