Oracle
 sql >> Database >  >> RDS >> Oracle

Inserisci record di massa nel database remoto (dblink) utilizzando Bulk Collect

Il messaggio di errore sembra abbastanza chiaro :

In effetti, ti colleghi a un'altra domanda che spiega che si tratta di una restrizione di implementazione. PL/SQL non ci consente di utilizzare le istruzioni FORALL attraverso i collegamenti al database e basta.

Fortunatamente non è necessario utilizzare la raccolta in blocco e FORALL nel codice. Una semplice istruzione INSERT INTO .... SELECT dovrebbe vederti bene:

INSERT INTO [email protected] 
    SELECT A.PARTY_SITE_NUMBER FMAT_FMATID, B.ZADDRESSFMATID F4F_FMATID,
    C.ADDRESS1 FMAT_VALUE, B.STREET F4F_VALUE , 'ADDRESS1' 
    FROM [email protected] A , f4f_corporateaccount B , [email protected] C
    WHERE 1=1
    AND B.ROLECODETEXT = 'Site Account'
    AND A.PARTY_SITE_NUMBER = B.ZADDRESSFMATID
    AND A.STATUS = 'A'

    UNION ALL 
    ------------------------------------------------------Address2-----------------------------------------------------------------------------

    SELECT A.PARTY_SITE_NUMBER FMAT_FMATID, B.ZADDRESSFMATID F4F_FMATID,
    C.ADDRESS2 FMAT_VALUE, B.addressline1 F4F_VALUE , 'ADDRESS2'  
    FROM [email protected] A , f4f_corporateaccount B , [email protected] C
    WHERE 1=1
    AND B.ROLECODETEXT = 'Site Account'
    AND A.PARTY_SITE_NUMBER = B.ZADDRESSFMATID
    AND A.STATUS = 'A'

Il tuo codice non usa la sintassi di join ANSI 92 esplicita e hai stropicciato il codice, quindi è difficile da leggere. Di conseguenza è facile non notare di non aver scritto una condizione di unione per [email protected] C . Quindi entrambe le sottoquery produrranno un prodotto cartesiano per tutti i record in C . Probabilmente non lo vuoi.

SELECT A.PARTY_SITE_NUMBER as FMAT_FMATID
        , B.ZADDRESSFMATID as F4F_FMATID
        , C.ADDRESS2 as FMAT_VALUE
        , B.addressline1 as F4F_VALUE
        , 'ADDRESS2'  
FROM [email protected] A
      inner join  f4f_corporateaccount B on A.PARTY_SITE_NUMBER = B.ZADDRESSFMATID
      inner join  [email protected] C on ** something goes here **
WHERE  B.ROLECODETEXT = 'Site Account'
AND A.STATUS = 'A'

Più facile da capire, facile da individuare il join mancante. La leggibilità è una caratteristica.