如何在 Oracle 存储过程中为 MERGE 命令使用 table 输入参数
How to use table input parameter for MERGE command in Oracle Stored Procedure
我目前正在尝试编写一个存储过程,用于将多行插入或更新到我的数据库中。我通过 table 输入参数传递行,但我仍然不知道如何将这些行传递给 MERGE 命令。
此命令运行良好:
MERGE INTO dbo.EntryTable a
USING (SELECT 'abc' "keyColumn", 'def' "valueColumn" FROM DUAL) b
ON (a."keyColumn" = b."keyColumn")
WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
WHEN NOT MATCHED THEN
INSERT ("keyColumn","valueColumn")
VALUES(b."keyColumn",b."valueColumn);
为了将其放入存储过程中,我创建了一个 table 类型:
CREATE OR REPLACE TYPE entry_type AS OBJECT
(
"keyColumn" NVARCHAR2(3),
"valueColumn" NVARCHAR2(3)
);
CREATE OR REPLACE TYPE entry_type_list AS TABLE OF entry_type;
但是当我尝试在这样的存储过程中使用它时:
CREATE OR REPLACE PROCEDURE set_entry_list (entries entry_type_list) AS
BEGIN
MERGE INTO dbo.EntryTable a
USING (SELECT * FROM entry_type_list) b
ON (a."keyColumn" = b."keyColumn")
WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
WHEN NOT MATCHED THEN
INSERT ("keyColumn","valueColumn")
VALUES(b."keyColumn",b."valueColumn);
END;
我在创建存储过程时遇到这样的错误:
LINE/COL ERROR
3/5 PL/SQL: SQL Statement ignored
4/26 PL/SQL: ORA-00942: table or view does not exist
我试图找到有关如何执行此操作的文档,但我目前不知道去哪里查看。
如果您使用的是 11g,您仍然需要在查询中使用 table
运算符
SELECT * FROM TABLE( entry_type_list )
所以你的 MERGE
语句应该是这样的
MERGE INTO dbo.EntryTable a
USING (SELECT * FROM table( entry_type_list ) ) b
ON (a."keyColumn" = b."keyColumn")
WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
WHEN NOT MATCHED THEN
INSERT ("keyColumn","valueColumn")
VALUES(b."keyColumn",b."valueColumn);
我目前正在尝试编写一个存储过程,用于将多行插入或更新到我的数据库中。我通过 table 输入参数传递行,但我仍然不知道如何将这些行传递给 MERGE 命令。
此命令运行良好:
MERGE INTO dbo.EntryTable a
USING (SELECT 'abc' "keyColumn", 'def' "valueColumn" FROM DUAL) b
ON (a."keyColumn" = b."keyColumn")
WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
WHEN NOT MATCHED THEN
INSERT ("keyColumn","valueColumn")
VALUES(b."keyColumn",b."valueColumn);
为了将其放入存储过程中,我创建了一个 table 类型:
CREATE OR REPLACE TYPE entry_type AS OBJECT
(
"keyColumn" NVARCHAR2(3),
"valueColumn" NVARCHAR2(3)
);
CREATE OR REPLACE TYPE entry_type_list AS TABLE OF entry_type;
但是当我尝试在这样的存储过程中使用它时:
CREATE OR REPLACE PROCEDURE set_entry_list (entries entry_type_list) AS
BEGIN
MERGE INTO dbo.EntryTable a
USING (SELECT * FROM entry_type_list) b
ON (a."keyColumn" = b."keyColumn")
WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
WHEN NOT MATCHED THEN
INSERT ("keyColumn","valueColumn")
VALUES(b."keyColumn",b."valueColumn);
END;
我在创建存储过程时遇到这样的错误:
LINE/COL ERROR
3/5 PL/SQL: SQL Statement ignored
4/26 PL/SQL: ORA-00942: table or view does not exist
我试图找到有关如何执行此操作的文档,但我目前不知道去哪里查看。
如果您使用的是 11g,您仍然需要在查询中使用 table
运算符
SELECT * FROM TABLE( entry_type_list )
所以你的 MERGE
语句应该是这样的
MERGE INTO dbo.EntryTable a
USING (SELECT * FROM table( entry_type_list ) ) b
ON (a."keyColumn" = b."keyColumn")
WHEN MATCHED THEN UPDATE SET a."valueColumn" = b."valueColumn"
WHEN NOT MATCHED THEN
INSERT ("keyColumn","valueColumn")
VALUES(b."keyColumn",b."valueColumn);