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.

È stato utile?

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;

qui

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top