Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wstawiaj rekordy zbiorcze do zdalnej bazy danych (dblink) za pomocą Bulk Collect

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 [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'

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 [email protected] 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 [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'

Łatwiejsze do zrozumienia, łatwe do zauważenia brakującego sprzężenia. Czytelność to funkcja.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Boże Narodzenie przychodzi wcześnie (Oracle 12.2)

  2. Rozmiar magazynu Oracle NUMBER(p)?

  3. Rejestruj komunikaty o błędach w procedurze składowanej Oracle

  4. Dostęp/jet odpowiednik dekodowania Oracle

  5. Jak sformatować liczbę z przecinkiem w Oracle