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

Indsæt bulk-poster i fjerndatabasen (dblink) ved hjælp af Bulk Collect

Fejlmeddelelsen virker tydelig nok:

Du linker faktisk til et andet spørgsmål, som forklarer, at dette er en implementeringsbegrænsning. PL/SQL tillader os ikke at bruge FORALL-udsagn på tværs af databaselinks, og det er det.

Heldigvis behøver du ikke bruge bulk collect og FORALL i din kode. En simpel INSERT INTO .... SELECT-sætning burde se dig rigtigt:

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'

Din kode bruger ikke den eksplicitte ANSI 92 join-syntaks, og du har skruet koden op, så den er svær at læse. Det er derfor let at gå glip af, at du ikke har skrevet en tilslutningsbetingelse for [email protected] C . Så begge underforespørgsler vil producere et kartesisk produkt for alle poster i C . Du ønsker det sandsynligvis ikke.

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'

Lettere at forstå, let at se den manglende join. Læsbarhed er en funktion.




  1. Sådan skriver du komplekse forespørgsler i SQL

  2. Hvordan kan jeg filtrere data i et Apex Grid for at vise bestemte ting for bestemte brugergrupper?

  3. Sådan opretter du forbindelse til Oracle in go

  4. Hvilken maven-fase vil altid blive udført efter testfasen?