2009-02-28 16 views
1

我正在創建一個使用合併語句(upsert)更新/插入表的過程。現在我有一個問題:使用過程參數我必須做這個upsert。如何在合併語句中使用過程參數

程序xyz(a在table.a%類型中,b在table.b%類型中,....) 是 一些局部變量; 開始 合併成target_table 使用source_table - 代替源表的,我必須對(上表中的主鍵狀態) 然後匹配時 更新表 當不匹配,然後使用此處 過程參數 插入表格; end xyz; 那麼如何在合併語句中使用過程參數代替源表?或 建議我查詢以獲取過程參數並將其用作源表值。

請幫我。 在此先感謝。

+0

嗨raskart,結帳新版本,這應該沒問題。 – 2009-03-02 11:05:27

回答

0

莫比類似

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

+0

嗨coldice, 感謝您的回覆.. 我正在尋找一個查詢,使它直接使用過程參數,而不是source_table /視圖合併stmt。此查詢應提供值(即參數)在merge語句中的Using關鍵字之後。 – raskart 2009-02-28 11:54:26

0

它很難從講你確切地詢問你究竟是什麼,但是我收集你想要你合併到(或者)的表格是動態的。在這種情況下,你應該使用的是DBMS_SQL包創建動態SQL

0

我知道我晚了八年晚了,但我認爲我正在嘗試做類似於你在做什麼,但嘗試基於傳入存儲過程的參數進行Upsert,該過程在成功時返回一個空字符串,並在失敗時返回到我的VB代碼。下面是我的所有代碼以及解釋我做了什麼的評論,以及爲什麼我這麼做了。讓我知道這是否有助於您或其他人。這是我第一次回覆帖子。

PROCEDURE UpsertTSJobData(ActivitySeq_in IN NUMBER, 
    Owner_in In VARCHAR2, 
    NumTrailers_in IN NUMBER, 
    ReleaseFormReceived_in IN NUMBER, 
    Response_out OUT VARCHAR2) AS 

    err_num NUMBER; 
    err_msg VARCHAR2(4000); 

    BEGIN 
    --This top line essentially does a "SELECT *" from the named table 
    --and looks for a match based on the "ON" statement below 
    MERGE INTO glob1app.GFS_TS_JOBDATA_TAB tsj 
    --This select statement is used for the INSERT when no match 
    --is found and the UPDATE when a match is found. 
    --It creates a "pseudo-table" 
    USING (
     SELECT ActivitySeq_in AS ActSeq, 
     Owner_in As Owner, 
     NumTrailers_in As NumTrailers, 
     ReleaseFormReceived_in As ReleaseFormReceived 
     FROM DUAL) input 
    --This ON statement is what we're doing the match on to find 
    --matching records. This decides whether it will be an 
    --INSERT or an UPDATE 
    ON (tsj.Activity_seq = ActivitySeq_in) 
    WHEN MATCHED THEN 
     --Here we UPDATE based on the passed in input table 
     UPDATE 
     SET OWNER = input.owner, 
      NUMTRAILERS = input.NumTrailers, 
      RELEASEFORMRECEIVED = input.releaseformreceived 
    WHEN NOT MATCHED THEN 
     --Here we INSERT based on the passed in input table 
     INSERT (
     ACTIVITY_SEQ, 
     OWNER, 
     NUMTRAILERS, 
     RELEASEFORMRECEIVED 
     ) 
     VALUES (
     input.actseq, 
     input.owner, 
     input.numtrailers, 
     input.releaseformreceived 
    ); 

    Response_out := ''; 

    EXCEPTION 
     WHEN OTHERS THEN 
     err_num := SQLCODE; 
     err_msg := SUBSTR(SQLERRM, 1, 3900); 
     Response_out := TO_CHAR (err_num) || ': ' || err_msg; 
    END; 
相關問題