1

使用下面的过程,我们尝试将数据从 SQL Server 传输到 oracle,但我们收到错误:

Tarih : 20/01/2011, Hata yeri :
pr_get_customer, Hata Açıklaması:
-28500 => v_trace : 2,v_transfer_id :1ORA-28500: ORACLE sisteminden Oracle olmayan sisteme bağlantı şu mesajı
verdi: [Oracle][ODBC SQL Server
Driver][ SQL Server]
无法绑定多部分标识符“PUBLIC.TMP_CUSTOMER.TRANSFER_ID”。{42000,NativeErr = 4104} ORA-02063:önceki 2 行,kaynağı DBLINK_NAV2

v trace 是我们定位错误区域的变量, transfer_id 获取 value 。

该过程在此处列出:

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

我认为更好的问题是:将数据从 SQL Server 移动到 Oracle 的最佳方法是从 MSSS 中删除每个成功交付的行?

您在循环中执行这些操作,以确保当您添加到一个时,您会从另一个中删除。

如果插入时发生了一些未知的随机事件,您将避免删除源记录。

这就是要点,对吧?

有更好的方法来处理这种数据移动,然后在每个插入/删除分布式事务循环之后提交。

首先,在循环中间提交是很糟糕的。在 Oracle 中,这是导致其他会话出现 ORA-01555 错误的好方法。因此,如果可能的话,我会避免这种情况。

其次,您应该绝对知道插入时出现合理错误的可能原因是什么。您违反了列长度,FK,UK ...插入时可能会中断的内容有限。像无法扩展表空间这样的大毛病应该导致系统停止运行。没有必要为此而设下陷阱。但是像我提到的应用程序问题很容易管理。

如果我正在写这篇文章,我将使用 Oracle 的LOG ERRORS INTO批量插入所有行,以避免在只有一行/几行失败时发生完整的 ROLLBACK。

现在您有一个表,其中包含每个失败的行及其失败的原因。现在您可以在 SQL Server 端删除所有不在失败 ID 列表中的行。

您已经完成了同样的事情,但是使用基于集合的操作而不是 SLOW-BY-SLOW,哎呀,我的意思是逐行。

于 2011-01-21T00:09:23.437 回答