Oracle
 sql >> Base de données >  >> RDS >> Oracle

Insérer des enregistrements en bloc dans la base de données distante (dblink) à l'aide de Bulk Collect

Le message d'erreur semble assez clair :

En effet, vous créez un lien vers une autre question qui explique qu'il s'agit d'une restriction d'implémentation. PL/SQL ne nous permet pas d'utiliser des instructions FORALL sur des liens de base de données et c'est tout.

Heureusement, vous n'avez pas besoin d'utiliser la collecte en bloc et FORALL dans votre code. Une simple instruction INSERT INTO .... SELECT devrait vous voir correctement :

INSERT INTO example@sqldat.com 
    SELECT A.PARTY_SITE_NUMBER FMAT_FMATID, B.ZADDRESSFMATID F4F_FMATID,
    C.ADDRESS1 FMAT_VALUE, B.STREET F4F_VALUE , 'ADDRESS1' 
    FROM example@sqldat.com A , f4f_corporateaccount B , example@sqldat.com 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 example@sqldat.com A , f4f_corporateaccount B , example@sqldat.com C
    WHERE 1=1
    AND B.ROLECODETEXT = 'Site Account'
    AND A.PARTY_SITE_NUMBER = B.ZADDRESSFMATID
    AND A.STATUS = 'A'

Votre code n'utilise pas la syntaxe de jointure ANSI 92 explicite et vous avez froissé le code de sorte qu'il est difficile à lire. Par conséquent, il est facile de ne pas remarquer que vous n'avez pas écrit de condition de jointure pour example@sqldat.com C . Ainsi, les deux sous-requêtes produiront un produit cartésien pour tous les enregistrements en C . Vous ne voulez probablement pas cela.

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 example@sqldat.com A
      inner join  f4f_corporateaccount B on A.PARTY_SITE_NUMBER = B.ZADDRESSFMATID
      inner join  example@sqldat.com C on ** something goes here **
WHERE  B.ROLECODETEXT = 'Site Account'
AND A.STATUS = 'A'

Plus facile à comprendre, facile à repérer la jointure manquante. La lisibilité est une caractéristique.