【问题标题】:How to fix oracle PL/SQL: ORA-00909: invalid number of argumentsCompilation failed,line 8 (13:53:12)如何修复 oracle PL/SQL: ORA-00909: invalid number of argumentsCompilation failed,line 8 (13:53:12)
【发布时间】:2021-08-14 18:59:08
【问题描述】:

我正在 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;

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

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

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

【问题讨论】:

  • 您的选择语句无效。在 Mysql 中是允许的。我认为有问题。
  • @AnkitBajpai 我认为 select 语句没有问题
  • 在 Oracle 中,没有双表就无法运行任何选择。
  • @RamiFar - 确实如此;除了 concat() 调用有太多参数,你没有 from 子句(也没有 into 子句)。
  • 除了 Oracle 中缺少的 FROM 子句之外,concat function 需要 正好 2 个参数,你的有 8 个。你可以嵌套它们,所以你有 concat(concat(cancat (...)))))) 或转换为concatenation operator (||)。 智慧之语: 不要与它每次都获胜的编译器争论。你的工作是找出问题所在,而不是声明编译器不正确。

标签: sql oracle stored-procedures plsql oracle-apex


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    例如:

    SELECT CONCAT(CONCAT('A', 'B'),'C') 从双; 结果:'ABC'

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多