Как использовать параметры процедуры в операторе слияния
Я создаю процедуру для обновления / вставки таблицы с помощью оператора слияния (upsert). Теперь у меня проблема: используя параметры процедуры, я должен сделать это upsert.
процедура xyz (a в table.a% type, b в table.b% type, ....) - это некоторые локальные переменные; начать слияние в target_table с помощью source_table - вместо исходной таблицы я должен использовать здесь параметры процедуры (условие для первичного ключа в таблице) при сопоставлении, затем обновить таблицу, если она не сопоставлена, затем вставить таблицу; конец xyz; Итак, как использовать параметры процедуры вместо исходной таблицы в операторе слияния ?? или предложить мне запрос для получения параметров процедуры и использования их в качестве значений исходной таблицы.
Помоги мне, пожалуйста. Заранее спасибо.
Ответов (3)3
Маби что-то вроде
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;
Также вы можете попробовать использовать так называемую временную таблицу (выберите 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;
см. здесь
Я знаю, что опаздываю на вечеринку на восемь лет, но я думаю, что пытался сделать что-то похожее на то, что делали вы, но пытался выполнить 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;
Очень сложно сказать от вашего вопроса, что именно вы и что, но я так понимаю, вы хотите, чтобы таблица, в которую вы сливаете (или с которой), была динамической. В этом случае вам следует использовать пакет DBMS_SQL для создания динамического SQL.