【问题标题】:PL/SQL script throws errorsPL/SQL 脚本抛出错误
【发布时间】:2015-09-03 16:17:59
【问题描述】:

我正在使用 PLSQL 创建一个基于查询另一个表来更新表的过程,为此我使用了一个循环。对于测试,我推迟了程序代码,只是试图使以下脚本工作。但它不断抛出错误,包括“遇到符号“文件结尾””或“无效的 SQL 语句”,基于小的调整。我哪里错了?

DECLARE CURSOR cur IS
    SELECT * FROM Summary;
BEGIN
FOR rec in cur
LOOP
UPDATE Award
SET monthly_sales = (
   SELECT COUNT(*)
   FROM Sales
   WHERE employee_id = rec.employee_id
     AND to_char(Sales.SALES_DATE,'YY/MM')=to_char(SYSDATE,'YY/MM')
)
WHERE Summary.employee_id = rec.employee_id
END LOOP
END;
/

【问题讨论】:

  • 在格式字符串中使用AND trunc(Sales.SALES_DATE,'month') = trunc(SYSDATE,'month')to_char 函数可能会更好。如果您的销售表曾经包含超过 100 年的数据,您可以获得超过一个世纪的计数,尽管这个错误需要很长时间才能出现。
  • @boneist 点,你可以在纯 SQL 中执行此操作,这将比循环中逐行更新更快。

标签: sql oracle stored-procedures plsql


【解决方案1】:

除了 Sentinel 指出的缺少分号外,您的 where 子句也不正确:

WHERE Summary.employee_id = rec.employee_id;

也许你的意思是:

WHERE award.employee_id = rec.employee_id;

因为您要更新 AWARD 表?

但是,当您可以在单个语句中轻松完成时,我会质疑您为什么要为此使用逐行(又名逐行)方法?也许像下面这样的东西会给你正确的结果(未经测试,因为你没有提供表格创建脚本或示例输入数据等):

merge into award tgt
using (select sls.employee_id,
              count(*) monthly_sales
       from   sales sls
       where  trunc(sls.sales_date,'mm') = trunc(sysdate, 'mm')
       and    sls.employee_id in (select employee_id from summary)
       group by sls.employee_id) src
  on (tgt.employee_id = src.employee_id)
when matched then
update set tgt.monthly_sales = src.monthly_sales;

【讨论】:

    【解决方案2】:

    第 12 行和第 13 行末尾缺少分号:

        DECLARE CURSOR cur IS
        SELECT * FROM Summary;
    BEGIN
      FOR rec in cur
      LOOP
        UPDATE Award
        SET monthly_sales = (
           SELECT COUNT(*)
           FROM Sales
           WHERE employee_id = rec.employee_id
             AND trunc(Sales.SALES_DATE,'month') = trunc(SYSDATE,'month')
        )
        WHERE Summary.employee_id = rec.employee_id;
      END LOOP;
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      相关资源
      最近更新 更多