如何修复 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'
使用管道 ||是一个更舒适的解决方案。
我正在 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'
使用管道 ||是一个更舒适的解决方案。