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

如何修复oracle PL/SQL:ORA-00909:无效的参数数编译失败,第8行(13:53:12),sql,oracle,stored-procedures,plsql,oracle-apex,Sql,Oracle,Stored Procedures,Plsql,Oracle Apex,我正在Oracle Apex中使用以下代码创建一个过程 创建或替换过程weekely_报告 (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_en

我正在Oracle Apex中使用以下代码创建一个过程 创建或替换过程weekely_报告

(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只接受两个参数。您可以嵌套呼叫:

SELECT concat(concat(concat(....
但这会变得混乱和难以管理。使用串联运算符| |更简单:

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

但是,在Oracle中,您必须从某些内容中进行选择,在本例中,如果where条件标识一行,则可能是您刚刚更新的表;尽管基于两个日期之间的天数的条件似乎不太可能做到这一点——也许应该寻找匹配的开始日期和结束日期,而不是范围的大小?那么它可能是独一无二的。但是在PL/SQL中,您还必须选择一些内容,例如局部变量或OUT参数

您也许可以在update语句中使用

不过,您不清楚生成的字符串会发生什么情况。

Oracle只接受两个参数。您可以嵌套呼叫:

SELECT concat(concat(concat(....
但这会变得混乱和难以管理。使用串联运算符| |更简单:

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

但是,在Oracle中,您必须从某些内容中进行选择,在本例中,如果where条件标识一行,则可能是您刚刚更新的表;尽管基于两个日期之间的天数的条件似乎不太可能做到这一点——也许应该寻找匹配的开始日期和结束日期,而不是范围的大小?那么它可能是独一无二的。但是在PL/SQL中,您还必须选择一些内容,例如局部变量或OUT参数

您也许可以在update语句中使用


但不清楚生成的字符串会发生什么情况。

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

例如:

选择concat'A'、'B'、'C' 来自双重; 结果:“ABC”


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

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

例如:

选择concat'A'、'B'、'C' 来自双重; 结果:“ABC”


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

您的select语句无效。在Mysql中是允许的。我认为这是问题所在。@AnkitBajpai我认为select语句在Oracle中没有问题。没有双表,您无法运行任何select。@RamiFar-它有问题;除了concat调用有太多的参数外,您没有from子句和into子句。除了Oracle中缺少from子句外,它只接受2个参数,您的参数有8个。你可以把它们放在巢里,这样你就有了Concat。。。或转换为| |。智慧之言:不要每次都和它赢的编译器争论。您的工作是找出错误,而不是声明编译器不正确。select语句无效。在Mysql中是允许的。我认为这是问题所在。@AnkitBajpai我认为select语句在Oracle中没有问题。没有双表,您无法运行任何select。@RamiFar-它有问题;除了concat调用有太多的参数外,您没有from子句和into子句。除了Oracle中缺少from子句外,它只接受2个参数,您的参数有8个。你可以把它们放在巢里,这样你就有了Concat。。。或转换为| |。智慧之言:不要每次都和它赢的编译器争论。您的工作是找出错误,而不是声明编译器不正确。