Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Insira registros em massa no banco de dados remoto (dblink) usando o Bulk Collect


A mensagem de erro parece bastante clara:

De fato, você vincula a outra pergunta que explica que essa é uma restrição de implementação. PL/SQL não nos permite usar instruções FORALL em links de banco de dados e pronto.

Felizmente, você não precisa usar coleta em massa e FORALL em seu código. Uma simples instrução INSERT INTO .... SELECT deve ver você corretamente:
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'

Seu código não usa a sintaxe explícita de junção ANSI 92 e você amassou o código, tornando-o difícil de ler. Consequentemente, é fácil não perceber que você não escreveu uma condição de associação para [email protected] C . Portanto, ambas as subconsultas produzirão um Produto Cartesiano para todos os registros em C . Você provavelmente não quer isso.
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'

Mais fácil de entender, fácil de identificar a junção ausente. A legibilidade é um recurso.