如何在merge语句中使用过程参数

时间:2009-02-28 10:59:32

标签: stored-procedures plsql parameters upsert

我正在创建一个使用merge语句(upsert)更新/插入表的过程。现在我遇到了一个问题:使用过程参数我必须做这个upsert。

过程xyz(表中有一个%.a%,b为table.b%类型,....) 是 一些局部变量; 开始 合并到target_table 使用source_table - 而不是源表,我必须在这里使用过程参数 on(表中主键的条件) 当匹配时 更新表格 什么时候不匹配 插入表格; 结束xyz​​; 那么如何在merge语句中使用过程参数代替源表?要么 建议我一个查询来获取过程参数并将其用作源表值。

请帮助我。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

我知道我已经晚了八年,但我认为我正在尝试做类似于你正在做的事情,但是试图根据传递给存储过程的参数进行Upsert,该存储过程返回一个空字符串成功和失败回到我的VB代码错误。下面是我的所有代码以及解释我所做的事情以及我为什么这样做的评论。如果这有助于您或其他任何人,请告诉我。这是我第一次回复帖子。

<tr>

答案 1 :(得分:0)

Maby之类的东西

DECLARE V_EXISTS NUMBER;
BEGIN SELECT COUNT(*) INTO V_EXISTS FROM TARGET_TABLE WHERE PK_ID = :ID;

    IF V_EXISTS  > 0 THEN
        -- UPDATE
    ELSE
        -- INSERT
    END IF;
END;

另外,您可以尝试使用所谓的tempotary表(从DUAL中选择)

CREATE TABLE TEST (N NUMBER(2), NAME VARCHAR2(20), ADRESS VARCHAR2(100));
INSERT INTO TEST VALUES(1, 'Name1', 'Adress1');
INSERT INTO TEST VALUES(2, 'Name2', 'Adress2');
INSERT INTO TEST VALUES(3, 'Name3', 'Adress3');
SELECT * FROM TEST;
-- test update
MERGE INTO TEST trg
USING (SELECT 1 AS N, 'NameUpdated' AS NAME, 
  'AdressUpdated' AS ADRESS FROM Dual )  src                
ON ( src.N = trg.N )
WHEN MATCHED THEN
    UPDATE 
    SET trg.NAME = src.NAME,
        trg.ADRESS = src.ADRESS
WHEN NOT MATCHED THEN
    INSERT VALUES (src.N, src.NAME, src.ADRESS);
SELECT * FROM TEST;
-- test insert
MERGE INTO TEST trg
USING (SELECT 34 AS N, 'NameInserted' AS NAME, 
  'AdressInserted' AS ADRESS FROM Dual )  src                
ON ( src.N = trg.N )
WHEN MATCHED THEN
    UPDATE 
    SET trg.NAME = src.NAME,
        trg.ADRESS = src.ADRESS
WHEN NOT MATCHED THEN
    INSERT VALUES (src.N, src.NAME, src.ADRESS);
SELECT * FROM TEST;
DROP TABLE TEST;

请参阅here

答案 2 :(得分:0)

很难从你这里得知你究竟是什么,但我知道你想要合并到(或)的表是动态的。在这种情况下,您应该使用的是创建动态SQL的DBMS_SQL