2009-02-28 4 views
1

Я создаю процедуру для обновления/вставки таблицы с помощью оператора слияния (upsert). Теперь у меня есть проблема: используя параметры процедуры, я должен это сделать.Как использовать параметры процедуры в операторе слияния

процедура xyz (a в таблице.a% тип, b в таблице.b% тип, ....) некоторые локальные переменные; начинают сливаются в target_table используя source_table - вместо исходной таблицы, я должен использовать параметры процедуры здесь на (условие на первичный ключ в таблице) при сопоставлении затем обновление таблицы , когда не совпадают, то Вставить стол; end xyz; , так как использовать параметры процедуры вместо исходной таблицы в заявлении о слиянии ?? или предложите мне запрос для извлечения параметров процедуры и использования его в качестве значений исходной таблицы.

помогите мне пожалуйста. Спасибо заранее.

+0

Привет, раскарт, проверка новой версии, все должно быть хорошо. –

ответ

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

+0

Hi coldice, Спасибо за ответ .. Я ищу запрос, чтобы он напрямую использовал параметры процедуры, а не source_table/view в merge stmt. Этот запрос должен предоставлять значения (например, параметры). После использования слова «Использовать» в операторе слияния. – raskart

+0

Привет, я пробовал использовать метод временной таблицы, но он показывает ошибку: «ora: 00969: missing ON keyword». – raskart

+0

Привет, холодная .. Спасибо за любезную помощь ya ...... – raskart

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; 
Смежные вопросы