如何在 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);