Oracle 甲骨文插入。。。SELECT插入0行,但SELECT返回的行数不超过0行
我有一个插页。。。Select语句将一些行插入PL/SQL过程中的表中。在语句末尾,我使用SQL%ROWCOUNT捕获插入的行数,并将其放入日志表中 这里有一个例子,日志显示插入了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,
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并编译它来准确地演示你的问题?