Thông báo lỗi có vẻ đủ rõ ràng:
Thật vậy, bạn liên kết đến một câu hỏi khác giải thích rằng đây là một hạn chế triển khai. PL / SQL không cho phép chúng tôi sử dụng câu lệnh FORALL qua các liên kết cơ sở dữ liệu và đó là điều đó.
May mắn thay, bạn không cần phải sử dụng thu thập hàng loạt và FORALL trong mã của mình. Một câu lệnh INSERT INTO .... SELECT đơn giản sẽ giúp bạn hiểu đúng:
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'
Mã của bạn không sử dụng cú pháp nối ANSI 92 rõ ràng và bạn đã tóm tắt mã nên rất khó đọc. Do đó, rất dễ bỏ sót rằng bạn chưa viết điều kiện tham gia cho [email protected] C
. Vì vậy, cả hai truy vấn con sẽ tạo ra một Sản phẩm Descartes cho tất cả các bản ghi trong C
. Có thể bạn không muốn điều này.
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'
Dễ hiểu hơn, dễ dàng phát hiện phần nối bị thiếu. Khả năng đọc là một tính năng.