【发布时间】:2021-05-23 18:02:49
【问题描述】:
该过程需要两个日期并查找在此期间发布的报告,并更新总工资并打印它们。
CREATE OR REPLACE PROCEDURE Salary_Update(p_Date1 DATE, p_Date2 DATE) AS
CURSOR MYCR IS
SELECT ReportID, TotalSale, Rate, TotalSalary, ReportDate
FROM WEEKLY_REPORT
WHERE ReportDate BETWEEN TO_DATE(p_Date1, 'DD-MM-YYYY') AND TO_DATE(p_Date2, 'DD-MM-YYYY');
BEGIN
FOR MYPOINTER IN MYCR LOOP
UPDATE WEEKLY_REPORT SET TotalSalary = ((TotalSale/100)*Rate);
DBMS_OUTPUT.PUT_LINE('The total salary for report ' || MYPOINTER.REPORTID || ' updated to ' || MYPOINTER.TotalSalary || 'dollars, which is ' || MYPOINTER.Rate || '% of the total sale of ' || MYPOINTER.TotalSale || 'dollars.');
WHERE ReportID = MYPOINTER.ReportID;
END LOOP;
END Salary_Update;
/
执行
BEGIN Salary_Update('02-04-2020','05-04-2020');
END;
BEGIN
Salary_Update(to_date('02-04-2020','dd-mm-yyyy'), to_date('05-04-2020','dd-mm-yyyy'));
END;
两者都不起作用。
【问题讨论】:
-
编译后做
show errors,或者查询user_errors,看看有什么问题。首先,您的更新包含:=而不是=。 -
@AlexPoole 我使用 oracle apex。显示错误不起作用
-
您可以按照@AlexPoole 的建议查询
user_errors。您正在对date进行to_date调用,除了update中的错误之外,这没有任何意义。您的update语句会更新表的每一行,因为没有where子句。打开一个遍历表中每一行的游标然后在循环中过滤掉大部分行的if语句确实没有意义。那应该是游标定义中的where子句。 -
您的输入参数被定义为 DATE,但是当您调用该过程时,您正在提供字符串。 DATE 是一种内部的二进制数据类型。
-
DBMS_OUTPUT 适用于调试,但不适用于正式报告。它不写入屏幕。它写入内部缓冲区。然后,当操作控制权返回给调用者时,该缓冲区在过程完成后传递回调用程序。然后由调用者决定是否处理缓冲区。并且一些调用程序甚至可能没有被编程为能够处理它。