1

以下の手順を使用して、SQL ServerからOracleにデータを転送しようとしていますが、エラーが発生します。

Tarih:20/01/2011
、Hata yeri:pr_get_customer、HataAçıklaması:
-28500 => v_trace:2、v_transfer_id:1ORA-28500:ORACLE sisteminden Oracle olmayansistemebağlantışumesajıverdi
:[Oracle] [ODBC SQL Server
Driver] [ SQLServer ]マルチパート識別子
「PUBLIC.TMP_CUSTOMER.TRANSFER_ID」をバインドできませんでした。{42000、NativeErr = 4104} ORA-02063:önceki2行、kaynağıDBLINK_NAV2

v traceはエラーの領域を見つけるための変数であり、transfer_idは値を取得します。

手順はここにリストされています:

PROCEDURE pr_get_customer
   IS
      CURSOR cur_tmp_customer
      IS
         SELECT "TRANSFER_ID" AS transfer_id, "INSERT_DATE" AS insert_date,
                "OP_TYPE" AS op_type, "STATUS" AS status, "No_" AS NO,
                "Name" AS NAME, "Name 2" AS name_2, "Address" AS address,
                "Address 2" AS address_2, "City" AS city,
                "Phone No_" AS phone_no, "Chain Name" AS chain_name,
                "Customer Price Group" AS customer_price_group,
                "Blocked" AS blocked,
                "Bill-to Customer No_" AS bill_to_customer_no,
                "Fax No_" AS fax_no, "SUBE" AS sube, "Alt Grup" AS alt_grup,
                "Location Code" AS location_code
           FROM nav_tmp_customer
          WHERE "STATUS" = 0
            AND ("TRANSFER_ID" > (SELECT NVL (MAX (transfer_id), 0)
                                    FROM t_tmp_customer));

      r_tmp_customer     cur_tmp_customer%ROWTYPE;

      TYPE tmp_customer_tbl_typ IS TABLE OF cur_tmp_customer%ROWTYPE;

      tmp_customer_tbl   tmp_customer_tbl_typ       := tmp_customer_tbl_typ
                                                                           ();
      v_trace            INTEGER                    := 0;
      v_transfer_id      NUMBER (28, 0)             := 0;
   BEGIN
      OPEN cur_tmp_customer;

      FETCH cur_tmp_customer
      BULK COLLECT INTO tmp_customer_tbl;

      CLOSE cur_tmp_customer;

      FOR x IN 1 .. tmp_customer_tbl.COUNT ()
      LOOP
         BEGIN
            v_trace := 1;

            INSERT INTO esiparis.t_tmp_customer
                        (transfer_id,
                         insert_date,
                         op_type,
                         status,
                         NO, NAME,
                         name2,
                         address,
                         address2,
                         city,
                         phone_no,
                         chain_name,
                         customer_price_group,
                         blocked,
                         bill_to_customer_no,
                         location_code,
                         fax_no,
                         sube,
                         alt_grup
                        )
                 VALUES (tmp_customer_tbl (x).transfer_id,
                         tmp_customer_tbl (x).insert_date,
                         tmp_customer_tbl (x).op_type,
                         tmp_customer_tbl (x).status,
                         tmp_customer_tbl (x).NO, tmp_customer_tbl (x).NAME,
                         tmp_customer_tbl (x).name_2,
                         tmp_customer_tbl (x).address,
                         tmp_customer_tbl (x).address_2,
                         tmp_customer_tbl (x).city,
                         tmp_customer_tbl (x).phone_no,
                         tmp_customer_tbl (x).chain_name,
                         tmp_customer_tbl (x).customer_price_group,
                         tmp_customer_tbl (x).blocked,
                         tmp_customer_tbl (x).bill_to_customer_no,
                         tmp_customer_tbl (x).location_code,
                         tmp_customer_tbl (x).fax_no,
                         tmp_customer_tbl (x).sube,
                         tmp_customer_tbl (x).alt_grup
                        );

            COMMIT;
            v_trace := 2;
            v_transfer_id := tmp_customer_tbl (x).transfer_id;

            DELETE FROM nav_tmp_customer
                  WHERE "TRANSFER_ID" = v_transfer_id;

            COMMIT;
            v_trace := 3;
         EXCEPTION
            WHEN OTHERS
            THEN
               ROLLBACK;
               pck_helper.pr_log_error (SQLCODE,
                                           'v_trace : '
                                        || v_trace
                                        || ',v_transfer_id :'
                                        || v_transfer_id
                                        || SQLERRM,
                                        'pr_get_customer'
                                       );
         END;
      END LOOP;
   EXCEPTION
      WHEN OTHERS
      THEN
         ROLLBACK;
         pck_helper.pr_log_error (SQLCODE,
                                  'v_trace : ' || v_trace || ',' || SQLERRM,
                                  'pr_get_customer'
                                 );
   END pr_**strong text****strong text****strong text**get_customer;

どんなアイデアでも大歓迎です、


更新:作業手順は以下のとおりです

PROCEDURE pr_get_item
IS
  CURSOR cur_tmp_item
  IS
     SELECT "TRANSFER_ID" AS transfer_id, "INSERT_DATE" AS insert_date,
            "OP_TYPE" AS op_type, "STATUS" AS status, "No_" AS NO,
            "Description" AS description,
            "Base Unit of Measure" AS base_unit_of_measure,
            "Inventory Posting Group" AS inventory_posting_group,
            "Net Weight" AS net_weight,
            "Genel Ürün Sahibi" AS genel_urun_sahibi,
            "Tab Code" AS tab_code,
            "Tab Unit of Measure" AS tab_unit_of_measure,
            "TAB Qty_ per Unit of Measure"
                                          AS tab_qty_per_unit_of_measure,
            "Blocked 2" AS blocked_2
       FROM nav_tmp_item
      WHERE "STATUS" = 0
        AND ("TRANSFER_ID" > (SELECT NVL (MAX (transfer_id), 0)
                                FROM t_tmp_item));

  r_tmp_item     cur_tmp_item%ROWTYPE;

  TYPE tmp_item_tbl_typ IS TABLE OF cur_tmp_item%ROWTYPE;

  tmp_item_tbl   tmp_item_tbl_typ       := tmp_item_tbl_typ ();
  v_trace        INTEGER                := 0;
  v_count        NUMBER (28, 0)         := 1;
BEGIN
  OPEN cur_tmp_item;

  FETCH cur_tmp_item
  BULK COLLECT INTO tmp_item_tbl;

  CLOSE cur_tmp_item;

  FOR x IN 1 .. tmp_item_tbl.COUNT ()
  LOOP
     BEGIN
        v_trace := 1;

        INSERT INTO esiparis.t_tmp_item
                    (transfer_id,
                     insert_date,
                     op_type, status,
                     NO, description,
                     base_unit_of_measure,
                     inventory_posting_group,
                     net_weight,
                     genel_urun_sahibi,
                     tab_code,
                     tab_unit_of_measure,
                     tab_qty_per_unit_of_measure,
                     blocked_2
                    )
             VALUES (tmp_item_tbl (x).transfer_id,
                     tmp_item_tbl (x).insert_date,
                     tmp_item_tbl (x).op_type, tmp_item_tbl (x).status,
                     tmp_item_tbl (x).NO, tmp_item_tbl (x).description,
                     tmp_item_tbl (x).base_unit_of_measure,
                     tmp_item_tbl (x).inventory_posting_group,
                     tmp_item_tbl (x).net_weight,
                     tmp_item_tbl (x).genel_urun_sahibi,
                     tmp_item_tbl (x).tab_code,
                     tmp_item_tbl (x).tab_unit_of_measure,
                     tmp_item_tbl (x).tab_qty_per_unit_of_measure,
                     tmp_item_tbl (x).blocked_2
                    );

        COMMIT;
        v_trace := 2;

        DELETE FROM nav_tmp_item
              WHERE "TRANSFER_ID" = tmp_item_tbl (x).transfer_id;

        COMMIT;
        v_trace := 3;
     EXCEPTION
        WHEN OTHERS
        THEN
           ROLLBACK;
           pck_helper.pr_log_error (SQLCODE,
                                    'v_trace : ' || v_trace || ','
                                    || SQLERRM,
                                    'pr_get_item'
                                   );
     END;
  END LOOP;
EXCEPTION
  WHEN OTHERS
  THEN
     ROLLBACK;
     pck_helper.pr_log_error (SQLCODE,
                              'v_trace : ' || v_trace || ',' || SQLERRM,
                              'pr_get_item'
                             );
END pr_get_item;
4

1 に答える 1

2

より良い質問は次のとおりです。SQLServerからOracleにデータを移動して、正常に配信されたすべての行をMSSSから削除する最良の方法は何ですか。

これらをループで実行して、一方に追加するときに、もう一方から削除するようにします。

挿入時に不明なランダムなエラーが発生した場合は、ソースレコードを削除しないようにします。

それが要点ですよね?

この種のデータ移動を処理し、分散トランザクションループの挿入/削除ごとにコミットするより良い方法があります。

ループの途中で最初にコミットするのは悪いことです。Oracleでは、他のセッションでORA-01555エラーを発生させるのに適した方法です。ですから、可能であればそれは避けたいと思います。

次に、挿入時の合理的なエラーの考えられる原因を完全に知っておく必要があります。列の長さ、FK、英国に違反しています...挿入時に破損する可能性のあるものの有限リストがあります。表領域を拡張できないなどの大きな問題は、システムを停止させる必要があります。そのためにトラップする必要はありません。しかし、私が述べたようなアプリケーションの問題は管理が簡単です。

これを書いているとしたら、OracleのLOG ERRORS INTOを使用してすべての行を一括挿入し、1行または数行だけが失敗したときに完全なロールバックを回避します。

これで、失敗したすべての行と失敗した理由を含むテーブルができました。これで、SQL Server側で、失敗したIDのリストにないすべての行を削除できます。

同じことを達成しましたが、SLOW-BY-SLOWの代わりにSetベースの操作を使用しました。つまり、行ごとです。

于 2011-01-21T00:09:23.437 に答える