ORA-00947 当 UPDATE 返回 BULK COLLECT INTO 用户创建的 TYPE TABLE 时出现“没有足够的值”

Posted

技术标签:

【中文标题】ORA-00947 当 UPDATE 返回 BULK COLLECT INTO 用户创建的 TYPE TABLE 时出现“没有足够的值”【英文标题】:ORA-00947 "not enough values" when UPDATE returning BULK COLLECT INTO user created TYPE TABLE 【发布时间】:2020-07-22 19:30:38 【问题描述】:

尝试批量收集到表类型时出现以下错误: ORA-00947“值不足”

我需要创建一个数据库级别的类型来使用我的应用程序访问结果集(打开游标)。

文件:FOO_STATUS.sql

CREATE OR REPLACE TYPE "FOO_STATUS" AS OBJECT
(
   a NUMBER,
   b NUMBER,
   c NUMBER
);
/

文件:FOO_STATUS_TABLE.sql

CREATE OR REPLACE TYPE FOO_STATUS_TABLE IS TABLE OF FOO_STATUS;
/

包装:

PROCEDURE foo
(
  ...
)
IS
  l_foo FOO_STATUS_TABLE := FOO_STATUS_TABLE();
BEGIN
      UPDATE foo_table
      SET ...
      WHERE ...
      RETURNING foo_table_a, foo_table_b, c BULK COLLECT INTO l_foo; -- ERROR: ORA-00947

OPEN p_results FOR
    SELECT
      foo_results.a   AS a,
      foo_results.b   AS b,
      foo_results.c   AS c,
      other.d         AS d
    FROM
      TABLE( l_foo ) foo_results INNER JOIN other_table other ON foo_results.obj = other.obj
END;

【问题讨论】:

【参考方案1】:

由于 l_foo 是一个对象表,您需要将对象收集到这个集合中,而不仅仅是像

这样的值
returning foo_status(a, b, c) bulk collect into l_foo

fiddle example

【讨论】:

以上是关于ORA-00947 当 UPDATE 返回 BULK COLLECT INTO 用户创建的 TYPE TABLE 时出现“没有足够的值”的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00947: 值不足

ORA-00947: 值不足

ORA-00947: 在 Oracle 中创建对象时值不足

SQL 错误:ORA-00947:没有足够的值 - 尝试使用默认值

尽管列和值匹配,Oracle 给我错误 ORA-00947

Mybatis 报错:ORA-00947: 没有足够的值