sql >> Databasteknik >  >> RDS >> Oracle

Infoga bulkposter i fjärrdatabas (dblink) med Bulk Collect

Felmeddelandet verkar tydligt nog:

Du länkar faktiskt till en annan fråga som förklarar att detta är en implementeringsbegränsning. PL/SQL tillåter inte oss att använda FORALL-satser över databaslänkar och det är det.

Lyckligtvis behöver du inte använda bulk collect och FORALL i din kod. En enkel INSERT INTO .... SELECT-sats bör se dig rätt:

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 kod använder inte den explicita ANSI 92 join-syntaxen och du har krystat upp koden så att den är svår att läsa. Följaktligen är det lätt att missa att du inte har skrivit ett anslutningsvillkor för [email protected] C . Så båda underfrågorna kommer att producera en kartesisk produkt för alla poster i C . Du vill förmodligen inte det här.

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'

Lättare att förstå, lätt att upptäcka den saknade kopplingen. Läsbarhet är en funktion.




  1. På INSERT till en tabell INSERT data i anslutna tabeller

  2. Finns det ett enklare sätt att hitta MODE(S) för vissa värden i MySQL

  3. Oracle-konverterar SQL till ANSI SQL

  4. .NET MySqlCommand @ platshållare kom i konflikt med MySQL-variabeln