PL/SQL脚本抛出错误
我正在使用PLSQL创建一个过程,在查询另一个表的基础上更新一个表,为此我使用了一个循环。为了进行测试,我暂缓编写过程代码,只是想让下面的脚本正常工作。但它不断抛出错误,包括“遇到了符号“文件结束”或“无效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
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进行此操作,这比循环中逐行更新要快。