Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL脚本抛出错误_Sql_Oracle_Stored Procedures_Plsql - Fatal编程技术网

PL/SQL脚本抛出错误

PL/SQL脚本抛出错误,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,我正在使用PLSQL创建一个过程,在查询另一个表的基础上更新一个表,为此我使用了一个循环。为了进行测试,我暂缓编写过程代码,只是想让下面的脚本正常工作。但它不断抛出错误,包括“遇到了符号“文件结束”或“无效SQL语句”,这是基于一些小的调整。我哪里做错了 DECLARE CURSOR cur IS SELECT * FROM Summary; BEGIN FOR rec in cur LOOP UPDATE Award SET monthly_sales = ( SELECT CO

我正在使用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;
/

第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;
/

第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;
/

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

WHERE Summary.employee_id = rec.employee_id;
也许你的意思是:

WHERE award.employee_id = rec.employee_id;
因为你在更新奖励表

然而,我想问一下,当您可以轻松地在一个语句中完成这项工作时,为什么要使用逐行(又称慢对慢)的方法来完成这项工作?也许下面这样的内容会给您提供正确的结果(未经测试,因为您没有提供表创建脚本或示例输入数据等):


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

WHERE Summary.employee_id = rec.employee_id;
也许你的意思是:

WHERE award.employee_id = rec.employee_id;
因为你在更新奖励表

然而,我想问一下,当您可以轻松地在一个语句中完成这项工作时,为什么要使用逐行(又称慢对慢)的方法来完成这项工作?也许下面这样的内容会给您提供正确的结果(未经测试,因为您没有提供表创建脚本或示例输入数据等):


最好使用
和trunc(Sales.Sales\u DATE,'month')=trunc(SYSDATE,'month')
然后使用格式字符串中带有两位数年份的
to\u char
函数。如果您的sales表包含超过100年的数据,您可能会得到一个多世纪的计数,尽管此错误需要很长时间才能出现。到@boneist点,您可以使用纯SQL来完成此操作,这比循环中逐行更新要快。使用
和trunc(sales.sales_DATE,'month')=trunc(SYSDATE,'month')可能更好
然后,
to_char
函数的格式字符串中有两位年份。如果您的销售表包含超过100年的数据,您可以从一个多世纪的数据中获取计数,尽管此错误需要很长时间才能出现。到@boneist点,您可以使用纯SQL进行此操作,这比循环中逐行更新要快。