如何在Oracle存储过程中将表输入参数用于MERGE命令

我当前正在尝试编写一个存储过程,该过程将多行插入或更新到数据库中。我通过表输入参数传递行,但是我在如何将这些行传递给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);

要将其放入存储过程中,我创建了一个表类型:

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",b."valueColumn);
END;

在创建存储过程时出现这样的错误:

  

LINE / COL ERROR

     
     

3/5 PL / SQL:忽略了SQL语句

     

4/26 PL / SQL:ORA-00942:表或视图不存在

我试图找到有关如何执行此操作的文档,但目前我不知道在哪里寻找。

a5550846 回答:如何在Oracle存储过程中将表输入参数用于MERGE命令

如果您使用的是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);
本文链接:https://www.f2er.com/3137286.html

大家都在问