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



我有一个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)替换为用于填充嵌套表的表,则过程运行良好。

是否有可能从嵌套表合并到另一个表?

是的,你的代码工作,不需要修改。


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

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之后,表中包含:

最新更新