sql >> データベース >  >> RDS >> Oracle

Bulk Collectを使用して、バルクレコードをリモートデータベース(dblink)に挿入します

    エラーメッセージは十分に明確に見えます:

    実際、これが実装上の制限であることを説明する別の質問にリンクしています。 PL / SQLでは、データベースリンク全体でFORALLステートメントを使用することはできません。

    幸い、コードで一括収集とFORALLを使用する必要はありません。単純なINSERTINTO.... SELECTステートメントで正しく表示されます:

    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'
    

    コードは明示的なANSI92結合構文を使用しておらず、コードを圧縮しているため、読みにくくなっています。したがって、[email protected] C 。したがって、両方のサブクエリは、Cのすべてのレコードに対してデカルト積を生成します。 。あなたはおそらくこれを望まないでしょう。

    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'
    

    理解しやすく、欠落している結合を見つけやすくなります。読みやすさは機能です。




    1. OracleInstantClientDYLD_LIBRARY_PATHエラー

    2. MySQL5.5.9およびTYPEでのHibernateテーブル作成エラー

    3. Postgresql:テーブル名/スキーマの混乱

    4. データベースマージテーブル