Oracle 甲骨文插入。。。SELECT插入0行,但SELECT返回的行数不超过0行

Oracle 甲骨文插入。。。SELECT插入0行,但SELECT返回的行数不超过0行,oracle,select,insert,Oracle,Select,Insert,我有一个插页。。。Select语句将一些行插入PL/SQL过程中的表中。在语句末尾,我使用SQL%ROWCOUNT捕获插入的行数,并将其放入日志表中 这里有一个例子,日志显示插入了0行,我也在目标表中验证了没有插入任何内容,但当我运行select语句时,它确实返回了0多行 这是密码 INSERT INTO J2_TRACK_PRICES (pgr_price_group_no,pgr_dep_dept_no, track_no,

我有一个插页。。。Select语句将一些行插入PL/SQL过程中的表中。在语句末尾,我使用SQL%ROWCOUNT捕获插入的行数,并将其放入日志表中

这里有一个例子,日志显示插入了0行,我也在目标表中验证了没有插入任何内容,但当我运行select语句时,它确实返回了0多行

这是密码

INSERT INTO J2_TRACK_PRICES 

(pgr_price_group_no,pgr_dep_dept_no,
                         track_no,
                         track_colour,
                         cost_price,
                         retail_price,
                        selling_price,
                          buying_price,
                         ticket_retail_price,
                                     ticket_selling_price,
                                     cost_gst_rate,
                                     retail_gst_rate)

           SELECT DISTINCT
                  pgr.price_group_no,
                  pgr.dep_dept_no,
                  bpd.track_no,
                  bpd.track_colour,
                  bpd.cost_price,
                  bpd.cost_price,
                  bpd.retail_price,
                  bpd.retail_price

FROM B2_TMP_PURCHASE_ORDER_DET bpd, J2_PRICE_GROUPS pgr

            WHERE     bpd.bph_po_no = dbt_po_no
                  AND pgr.dep_dept_no = dbt_dept_no
                  AND bpd.line_no IN (SELECT MIN (bpd2.line_no)
                                        FROM B2_TMP_PURCHASE_ORDER_DET bpd2
                                       WHERE bpd2.bph_po_no = bpd.bph_po_no
                                      GROUP BY bpd2.track_no, bpd2.track_colour)
                  AND NOT EXISTS
                         (SELECT 1
                            FROM J2_TRACK_PRICES trp
                           WHERE     trp.pgr_price_group_no = pgr.price_group_no
                                 AND trp.pgr_dep_dept_no = pgr.dep_dept_no
                                 AND trp.track_no = bpd.track_no
                                 AND trp.track_colour = bpd.track_colour);
你们以前遇到过吗


非常感谢

以下是程序。谢谢

PROCEDURE create_track_prices (dbt_po_no IN J2_PURCHASE_ORDER_HDR.po_no%TYPE,
                           dbt_dept_no IN j2_departments.dept_no%TYPE,
                           dbt_tracking_level IN J2_SKU_MASTER.tracking_level%TYPE)

IS
  n_true    CONSTANT INTEGER := 0;
  n_false   CONSTANT INTEGER := 1;
  n_rc               INTEGER;
  n_pre_gst          INTEGER;
  n_rate_none        J2_TRACK_PRICES.cost_gst_rate%TYPE;
  /*
   * vars for monitoring purpose TPR916
   */
  mon_grp            NUMBER;
  mon_boa_det        NUMBER;
  mon_cls            NUMBER;
BEGIN

  IF dbt_tracking_level = J2_Constants_Pkg.class_level
  THEN
     mon_catch_boa ('L5', dbt_po_no, 'tracking level: ' || dbt_tracking_level);

     SELECT COUNT (*)
       INTO mon_grp
       FROM J2_PRICE_GROUPS
      WHERE dep_dept_no = dbt_dept_no;

     mon_catch_boa ('L6', dbt_po_no, mon_grp || ' groups found');

     SELECT COUNT (*)
       INTO mon_boa_det
       FROM B2_TMP_PURCHASE_ORDER_DET
      WHERE bph_po_no = dbt_po_no;

     mon_catch_boa ('L7', dbt_po_no, mon_boa_det || ' detail records found');

     SELECT COUNT (*)
       INTO mon_cls
       FROM J2_CLASSES
      WHERE dep_dept_no = dbt_dept_no;

     mon_catch_boa ('L8', dbt_po_no, mon_cls || ' classes found');

     BEGIN
        INSERT INTO J2_TRACK_PRICES (pgr_price_group_no,
                                     pgr_dep_dept_no,
                                     track_no,
                                     track_colour,
                                     cost_price,
                                     ticket_retail_price,
                                     ticket_selling_price,
                                     buying_price,
                                     retail_price,
                                     selling_price,
                                     cost_gst_rate,
                                     retail_gst_rate)
           SELECT DISTINCT pgr.price_group_no,
                           pgr.dep_dept_no,
                           bpd.track_no,
                           J2_Constants_Pkg.default_track_colour,
                           0,
                           0,
                           0,
                           0,
                           0,
                           0,
                           cla.cost_gst_rate,
                           cla.retail_gst_rate
             FROM B2_TMP_PURCHASE_ORDER_DET bpd, J2_PRICE_GROUPS pgr, J2_CLASSES cla
            WHERE     bpd.bph_po_no = dbt_po_no
                  AND pgr.dep_dept_no = dbt_dept_no
                  AND bpd.line_no IN (SELECT MIN (bpd2.line_no)
                                        FROM B2_TMP_PURCHASE_ORDER_DET bpd2
                                       WHERE bpd2.bph_po_no = bpd.bph_po_no
                                      GROUP BY bpd2.track_no, bpd2.track_colour)
                  AND NOT EXISTS
                         (SELECT 1
                            FROM J2_TRACK_PRICES trp
                           WHERE     trp.pgr_price_group_no = pgr.price_group_no
                                 AND trp.pgr_dep_dept_no = pgr.dep_dept_no
                                 AND trp.track_no = bpd.track_no
                                 AND trp.track_colour = J2_Constants_Pkg.default_track_colour)
                  AND cla.dep_dept_no = pgr.dep_dept_no
                  AND cla.class_no = bpd.class_no;

        mon_catch_boa ('L9', dbt_po_no, 'Inserted: ' || SQL%ROWCOUNT || ' records');
     EXCEPTION
        WHEN OTHERS
        THEN
           log_exception (dbt_po_no, dbt_ins_cla_prices);
           RAISE;
     END;
  ELSE
     mon_catch_boa ('L10', dbt_po_no, 'tracking level: ' || dbt_tracking_level);

     SELECT COUNT (*)
       INTO mon_grp
       FROM J2_PRICE_GROUPS
      WHERE dep_dept_no = dbt_dept_no;

     mon_catch_boa ('L11', dbt_po_no, mon_grp || ' groups found');

     SELECT COUNT (*)
       INTO mon_boa_det
       FROM B2_TMP_PURCHASE_ORDER_DET
      WHERE bph_po_no = dbt_po_no;

     mon_catch_boa ('L12', dbt_po_no, mon_boa_det || ' detail records found');

     BEGIN
        IF J2_Gst_Pkg.date_less_than_gst_cutover (SYSDATE)
        THEN
           n_rc := J2_Gst_Pkg.get_gst_default_rate (J2_Gst_Pkg.GST_RATE_NONE, n_rate_none);
           n_pre_gst := n_true;
        ELSE
           n_pre_gst := n_false;
        END IF;

        INSERT INTO J2_TRACK_PRICES (pgr_price_group_no,
                                     pgr_dep_dept_no,
                                     track_no,
                                     track_colour,
                                     cost_price,
                                     retail_price,
                                     selling_price,
                                     buying_price,
                                     ticket_retail_price,
                                     ticket_selling_price,
                                     cost_gst_rate,
                                     retail_gst_rate)
           SELECT DISTINCT
                  pgr.price_group_no,
                  pgr.dep_dept_no,
                  bpd.track_no,
                  bpd.track_colour,
                  bpd.cost_price,
                  DECODE (n_pre_gst,
                          n_true, bpd.retail_price,
                          J2_Gst_Pkg.calculate_bus_retail_price (bpd.retail_price, bpd.retail_gst_rate)),
                  DECODE (n_pre_gst,
                          n_true, bpd.retail_price,
                          J2_Gst_Pkg.calculate_bus_retail_price (bpd.retail_price, bpd.retail_gst_rate)),
                  bpd.cost_price,
                  bpd.retail_price,
                  bpd.retail_price,
                  DECODE (n_pre_gst, n_true, n_rate_none, bpd.cost_gst_rate),
                  DECODE (n_pre_gst, n_true, n_rate_none, bpd.retail_gst_rate)
             FROM B2_TMP_PURCHASE_ORDER_DET bpd, J2_PRICE_GROUPS pgr
            WHERE     bpd.bph_po_no = dbt_po_no
                  AND pgr.dep_dept_no = dbt_dept_no
                  AND bpd.line_no IN (SELECT MIN (bpd2.line_no)
                                        FROM B2_TMP_PURCHASE_ORDER_DET bpd2
                                       WHERE bpd2.bph_po_no = bpd.bph_po_no
                                      GROUP BY bpd2.track_no, bpd2.track_colour)
                  AND NOT EXISTS
                         (SELECT 1
                            FROM J2_TRACK_PRICES trp
                           WHERE     trp.pgr_price_group_no = pgr.price_group_no
                                 AND trp.pgr_dep_dept_no = pgr.dep_dept_no
                                 AND trp.track_no = bpd.track_no
                                 AND trp.track_colour = bpd.track_colour);

        mon_catch_boa ('L13', dbt_po_no, 'Inserted: ' || SQL%ROWCOUNT || ' records');
     EXCEPTION
        WHEN OTHERS
        THEN
           log_exception (dbt_po_no, dbt_ins_trk_prices);
           RAISE;
     END;
  END IF;
END create_track_prices;
在VBA中调用上述过程,当用户运行VBA代码时,步骤13显示已插入0行。有趣的是,如果我让用户再次运行相同的进程,步骤13将显示72行,与我预期的一样。下面是我保存在日志表中的日志

2015年3月6日15:52:15 L2-PO:F579693-插入曲目价格

2015年3月6日15:52:15 L10-采购订单:F579693-跟踪级别:ST

2015年3月6日15:52:15 L11-PO:F579693-发现4组

2015年3月6日15:52:15 L12-采购订单:F579693-82找到详细记录

2015年3月6日15:52:15 L13-采购订单:F579693-插入:0条记录

2015年3月6日15:52:15 L4-采购订单:F579693-已完成插入轨道价格

2015年3月10日09:51:04 L2-PO:F579693-插入曲目价格

2015年3月10日09:51:04 L10-采购订单:F579693-跟踪级别:ST

2015年3月10日09:51:04 L11-PO:F579693-发现4组

2015年3月10日09:51:04 L12-采购订单:F579693-82找到详细记录

2015年3月10日09:51:04 L13-采购订单:F579693-插入:72条记录


2015年3月10日09:51:04 L4-PO:F579693-已完成在插入列表中插入曲目价格

11个字段,但在选择列表中仅插入8个字段?哦,对不起,我在SELECT语句中删除了4个带解码功能的字段。这就是问题所在吗?如果SELECT语句返回行,但INSERT语句不插入行,这意味着您没有进行苹果对苹果的比较。可能在运行INSERT时,SELECT没有返回行,因为您要查找的数据尚未提交或当时不存在。运行INSERT时使用的绑定变量可能与SELECT中使用的值不同。也许你无意中在错误的数据库中运行了一个。谢谢你的回复,贾斯汀。实际上,如果我让用户重新运行调用这段代码的进程,它将插入我所期望的。。。。我不知道这意味着什么。Justin的第一条语句的另一个含义可能是SQL%ROWCOUNT在代码中的位置不正确。你能不能举一个简单的例子,让其他人都可以创建DDL并编译它来准确地演示你的问题?