sql >> Base de Datos >  >> RDS >> Oracle

Inserte registros masivos en la base de datos remota (dblink) usando Bulk Collect

El mensaje de error parece bastante claro:

De hecho, se vincula a otra pregunta que explica que se trata de una restricción de implementación. PL/SQL no nos permite usar declaraciones FORALL en enlaces de bases de datos y eso es todo.

Afortunadamente, no necesita usar recolección masiva y FORALL en su código. Una simple instrucción INSERT INTO .... SELECT debería verlo bien:

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'

Su código no usa la sintaxis de combinación ANSI 92 explícita y ha arrugado el código para que sea difícil de leer. En consecuencia, es fácil pasar por alto que no ha escrito una condición de combinación para example@sqldat.com C . Entonces ambas subconsultas producirán un producto cartesiano para todos los registros en C . Probablemente no quieras esto.

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'

Más fácil de entender, fácil de detectar la unión que falta. La legibilidad es una característica.