Come utilizzare parametri della procedura di dichiarazione di fusione
-
11-09-2019 - |
Domanda
Sto creando una procedura per aggiornare / inserire una tabella utilizzando merge economico (upsert) .Ora ho un problema: utilizzando parametri della procedura che devo fare questo upsert.
procedura xyz (una in table.a tipo%, b in table.b tipo%, ....) è alcune variabili locali; inizio fondersi in target_table utilizzando tabella_origine - al posto della tabella di origine, devo usare parametri della procedura qui on (condizione sulla chiave primaria della tabella) se abbinato poi aggiornare la tabella quando non è abbinato poi inserire la tabella; end xyz; così come utilizzare parametri della procedura, invece di tabella di origine nella dichiarazione merge ?? o mi suggeriscono una query per recuperare i parametri della procedura e usarlo come valori della tabella di origine.
help me please. Grazie in anticipo.
Soluzione
Maby qualcosa come
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;
Inoltre, si può tentare di utilizzare la cosiddetta tabella tempotary (selezionare da 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;
Altri suggerimenti
Lo so che sono otto anni di ritardo alla festa, ma penso che stavo cercando di fare qualcosa di simile a quello che stavi facendo, ma cercando di upsert sulla base di parametri passati in una stored procedure che restituisce una stringa vuota in caso di successo e un errore in caso di fallimento di nuovo al mio codice di VB. Qui di seguito è tutto del mio codice insieme con i commenti per spiegare quello che ho fatto, e perché l'ho fatto. Fatemi sapere se questo tu o chiunque altro aiuta. Questa è la mia prima volta risponde un post.
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;
E 'molto difficile dire da voi in discussione esattamente quello che cosa, ma ho capito che si desidera che la tabella che si uniscono in (o su) per essere dinamico. In questo caso, ciò che si dovrebbe utilizzare è il pacchetto DBMS_SQL per creare SQL dinamico