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



我正在OracleApex中使用以下代码创建一个过程创建或替换程序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;

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

编译失败,第8行(13:53:12(PL/SQL:ORA-00909:无效数字的参数编译失败,第8行(13:53:12(PL/SQL:SQL语句忽略

但是参数的数量已经完成,我检查了两次。

Oracle的concat()函数只接受两个参数。你可以嵌套呼叫:

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中,您必须从中选择,在这种情况下,如果where条件标识了一行,则可能是您刚刚更新的表;尽管基于两个日期之间的天数的条件似乎不太可能做到这一点——也许这应该是寻找匹配的开始和结束日期,而不是范围的大小?那么它可能是独一无二的。但在PL/SQL中,您还必须在中选择,比如局部变量或OUT参数。

您也许可以在更新语句中使用returning into子句。

不过,目前还不清楚您希望生成的字符串会发生什么。

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

例如:

选择CONCAT(CONCAT('A','B'(,'C'(FROM对偶;结果:"ABC">

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

最新更新