我有一个 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:无效数据类型
我将如何解决这个问题?甚至可以从嵌套表合并到另一个表中吗?
是否可以将嵌套表合并到另一个表中?
是的,您的代码可以正常工作,不需要修复。
声明一个对象类型和一个集合类型:
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 |