oracle 与嵌套表合并,ORA-00902:无效数据类型

8oomwypt  于 2023-04-05  发布在  Oracle
关注(0)|答案(1)|浏览(219)

我有一个PL/SQL过程,在其中我使用动态SQL创建并填充一个嵌套表。
稍后我想使用这个嵌套表来更新另一个使用MERGE的表中的信息。
声明看起来有点像这样:

TYPE row_type IS RECORD (
   a db_table.a%type,
   b db_table.b%type,
   c db_table.c%type
);

TYPE nested_type IS TABLE OF row_type INDEX BY INTEGER;

nested_table nested_type;

然后用一些动态SQL填充该表
合并看起来像这样:

MERGE INTO db_table t
USING table(nested_table) nt ON (t.a = nt.a AND t.b = nt.b)

WHEN MATCHED 
   THEN
       UPDATE 
           SET c = nt.c,
               d = nt.d

WHEN NOT MATCHED 
   THEN
       INSERT (a, b, c, d)
       VALUES (nt.a, nt.b, nt.c, nt.d);

表'db_table'具有列a、b、c、d、e和f,而'nested_table'仅具有列a、b、c和d。
当我运行该过程时,我得到一个错误
ORA-00902:数据类型无效
我该如何解决这个问题?是否可以将嵌套表合并到另一个表中?

编辑

问题似乎出在以下部分:

MERGE into db_table t
USING table(nested_table) nt

如果我用填充嵌套表的表替换table(nested_table),则过程运行正常。

iq3niunx

iq3niunx1#

是否有可能将嵌套表合并到另一个表中?
是的,你的代码可以工作,不需要修复。
声明对象类型和集合类型:

CREATE TYPE obj_type IS OBJECT(
  a INT,
  b INT,
  c INT,
  d INT
);

CREATE TYPE obj_table IS TABLE OF obj_type;

然后创建一个表(这是一个对象派生的表,但标准的表声明也可以工作)并添加一些示例数据:

CREATE TABLE db_table OF obj_type;

INSERT INTO db_table (a,b,c,d)
SELECT 1 As a, 1 AS b, 1 AS c, 1 AS d FROM DUAL UNION ALL
SELECT 2, 2, 2, 2 FROM DUAL UNION ALL
SELECT 3, 3, 3, 3 FROM DUAL;

然后运行查询(使用匿名PL/SQL块定义nested_table变量):

DECLARE
  nested_table obj_table := obj_table(
    obj_type(1,1,2,3),
    obj_type(3,3,6,9),
    obj_type(4,4,8,12)
  );
BEGIN
  MERGE INTO db_table t
  USING TABLE(nested_table) nt
  ON (t.a = nt.a AND
      t.b = nt.b)
  WHEN MATCHED THEN
    UPDATE
    SET c = nt.c,
        d = nt.d
  WHEN NOT MATCHED THEN
    INSERT (a, b, c, d)
    VALUES (nt.a, nt.b, nt.c, nt.d);
END;
/

然后,在MERGE之后,该表包含:
| A|B|C|D|
| --------------|--------------|--------------|--------------|
| 1|1|第二章|三|
| 第二章|第二章|第二章|第二章|
| 三|三|六|九|
| 四|四|八|十二岁|
fiddle

相关问题