Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Fügen Sie mit Bulk Collect Massendatensätze in die Remote-Datenbank (dblink) ein

Die Fehlermeldung scheint klar genug:

In der Tat verlinken Sie auf eine andere Frage, die erklärt, dass dies eine Implementierungsbeschränkung ist. PL/SQL erlaubt uns nicht, FORALL-Anweisungen über Datenbankverknüpfungen hinweg zu verwenden, und das war's.

Glücklicherweise müssen Sie Bulk Collect und FORALL nicht in Ihrem Code verwenden. Eine einfache INSERT INTO .... SELECT-Anweisung sollte Sie richtig sehen:

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'

Ihr Code verwendet nicht die explizite ANSI 92-Join-Syntax, und Sie haben den Code zusammengeknüllt, sodass er schwer lesbar ist. Folglich ist leicht zu übersehen, dass Sie keine Join-Bedingung für [email protected] C . Beide Unterabfragen erzeugen also ein kartesisches Produkt für alle Datensätze in C . Das wollen Sie wahrscheinlich nicht.

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'

Einfacher zu verstehen, der fehlende Join ist leicht zu erkennen. Lesbarkeit ist eine Funktion.