如何修复 oracle PL/SQL:ORA-00909:参数数量无效编译失败,第 8 行 (13:53:12)

How to fix oracle PL/SQL: ORA-00909: invalid number of argumentsCompilation failed,line 8 (13:53:12)

我正在 Oracle Apex 中使用以下代码创建过程 创建或替换过程 weekely_report

(W_start IN weekely_report.StartDate%TYPE, W_end IN
weekely_report.EndDate%TYPE)
IS
BEGIN
UPDATE weekely_report
   SET commission_amount = Sales_Amount*Com_Rate
 where (StartDate-EndDate) = (w_start- W_end);

SELECT concat('New Commission amount of',ID,' is
',commission_amount,' dollars,
is equal to',commission_amount,'% of the total sale amount of ',Sales_Amount,' dollars.')

COMMIT;
END;

但是当我执行这个时,它给出了以下错误

Compilation failed,line 8 (13:53:12) PL/SQL: ORA-00909: invalid number of argumentsCompilation failed,line 8 (13:53:12) PL/SQL: SQL Statement ignored

但是参数的个数已经完成了,我查了两遍

Oracle 的 concat() function 只接受两个参数。您可以嵌套调用:

SELECT concat(concat(concat(....

但这会变得混乱且难以管理。使用连接运算符 ||:

更简单
SELECT 'New Commission amount of ' || ID || ' is ' || commission_amount
  || ' dollars, is equal to ' || commission_amount || '% of the total sale amount of '
  || Sales_Amount || ' dollars.'

顺便说一句,你的 % 看起来应该是一个计算。

然而,在 Oracle 中你必须 select from 一些东西,在这种情况下可能是你刚刚更新的 table 如果你的 where 条件识别一行;虽然基于两个日期之间的天数的条件似乎不太可能这样做 - 也许应该寻找匹配的开始和结束日期,而不是范围的大小?那么它可能是独一无二的。但是在 PL/SQL 中,您还必须 select 进入 诸如局部变量或 OUT 参数之类的东西。

您或许可以在更新语句中使用 the returning into clause

虽然您不清楚生成的字符串会发生什么。

首先,您必须在 SELECT 语句中添加“from DUAL”。之后,您必须使用 INTO 子句将结果存储到变量中。最后,在 Oracle 中,CONCAT 函数只允许您将两个值连接在一起。如果要连接两个以上的值,可以嵌套多个 CONCAT 函数调用。

例如:

SELECT CONCAT(CONCAT('A', 'B'),'C') 来自双重; 结果:'ABC'

使用管道 ||是一个更舒适的解决方案。