sql >> Database >  >> RDS >> Oracle

Bulkrecords invoegen in externe database (dblink) met behulp van Bulk Collect

De foutmelding lijkt duidelijk genoeg:

Je linkt inderdaad naar een andere vraag waarin wordt uitgelegd dat dit een implementatiebeperking is. PL/SQL staat ons niet toe om FORALL-statements te gebruiken voor databasekoppelingen en dat is het dan ook.

Gelukkig hoef je geen bulkcollect en FORALL in je code te gebruiken. Een eenvoudige INSERT INTO .... SELECT-instructie zou je gelijk moeten zien:

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'

Je code gebruikt niet de expliciete ANSI 92 join-syntaxis en je hebt de code verpulverd, zodat het moeilijk te lezen is. Het is daarom gemakkelijk over het hoofd te zien dat u geen lidmaatschapsvoorwaarde heeft geschreven voor [email protected] C . Beide subquery's produceren dus een Cartesiaans product voor alle records in C . Dit wil je waarschijnlijk niet.

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'

Gemakkelijker te begrijpen, gemakkelijk om de ontbrekende join te herkennen. Leesbaarheid is een functie.




  1. last_insert_id() versus SELECT Max(ID)

  2. Gebruik APP_NAME() om de toepassingsnaam van de huidige sessie in SQL Server op te halen

  3. Lob-segmenten (SYS_LOB) in orakel begrijpen?

  4. MySQL-fout #2014 - Opdrachten lopen niet synchroon; je kunt deze opdracht nu niet uitvoeren