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

问题描述 投票:0回答:1

我有一个 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 看起来像这样:


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:无效数据类型

我将如何解决这个问题?甚至可以从嵌套表合并到另一个表中吗?

sql oracle plsql dynamic-sql
1个回答
0
投票

是否可以将嵌套表合并到另一个表中?

是的,您的代码可以正常工作,不需要修复。


声明一个对象类型和一个集合类型:

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 C D
1 1 2 3
2 2 2 2
3 3 6 9
4 4 8 12

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.