Komunikat o błędzie wydaje się wystarczająco jasny:
Rzeczywiście łączysz się z innym pytaniem, które wyjaśnia, że jest to ograniczenie implementacji. PL/SQL nie pozwala nam na używanie instrukcji FORALL przez łącza do baz danych i to wszystko.
Na szczęście nie musisz używać zbiorczego zbierania i FORALL w swoim kodzie. Prosta instrukcja INSERT INTO .... SELECT powinna Cię dobrze widzieć:
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'
Twój kod nie używa wyraźnej składni złączenia ANSI 92, a kod został tak zgnieciony, że jest trudny do odczytania. W związku z tym łatwo jest przeoczyć, że nie napisałeś warunku dołączenia do example@sqldat.com C . Tak więc oba podzapytania wygenerują produkt kartezjański dla wszystkich rekordów w C . Prawdopodobnie tego nie chcesz.
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'
Łatwiejsze do zrozumienia, łatwe do zauważenia brakującego sprzężenia. Czytelność to funkcja.