0
我不明白爲什麼我的程序 中的遊標跳過行。 這是我的光標:在數據庫中跳過行記錄的PL/SQL遊標
OPEN c_denormalized_data FOR lv_sql_str;
LOOP
FETCH c_denormalized_data
INTO r_denormalized_data;
EXIT WHEN c_denormalized_data%NOTFOUND;
INSERT INTO bpdev.bp_real_to_fiskal_reference
(r_customer_trx_id,
r_trx_number,
r_trx_date,
r_amount,
r_amount_due_rem,
diff,
f_trx_number,
f_trx_date,
f_amount,
NULLS,
notnulls,
org_id,
data_loaded_for_days)
VALUES
(r_denormalized_data.r_customer_trx_id,
r_denormalized_data.r_trx_number,
r_denormalized_data.r_trx_date,
r_denormalized_data.r_amount,
r_denormalized_data.r_amount_due_rem,
r_denormalized_data.diff,
r_denormalized_data.f_trx_number,
r_denormalized_data.f_trx_date,
r_denormalized_data.f_amount,
r_denormalized_data.nulls,
r_denormalized_data.notnulls,
r_denormalized_data.org_id,
days_before_today);
COMMIT;
END LOOP;
lv_sql_str是動態選擇其中需要大約30分鐘的執行。 使用遊標是因爲此選擇是基於輸入參數動態生成的。 如果我只執行一條SELECT語句,我收到了我期望的所有數據,但是當我執行過程來插入數據庫時,我失去了記錄 ,這些記錄出現在我的SELECT返回的數據中。 我不明白爲什麼這些記錄被跳過,並沒有插入表中。 有沒有人有一個想法,我的錯誤是哪裏?
這裏是我的全碼:
PROCEDURE load_denormalized_data(errbuf OUT NOCOPY VARCHAR2,
retcode OUT NOCOPY NUMBER,
days_before_today IN NUMBER,
real_legal_entyties_id_list IN VARCHAR2) IS
TYPE tc_denormalized_data IS REF CURSOR;
c_denormalized_data tc_denormalized_data;
TYPE tr_denormalized_data IS RECORD(
r_customer_trx_id bpdev.bp_real_to_fiskal_reference.r_customer_trx_id%TYPE,
r_trx_number bpdev.bp_real_to_fiskal_reference.r_trx_number%TYPE,
r_trx_date bpdev.bp_real_to_fiskal_reference.r_trx_date%TYPE,
r_amount bpdev.bp_real_to_fiskal_reference.r_amount%TYPE,
r_amount_due_rem bpdev.bp_real_to_fiskal_reference.r_amount_due_rem%TYPE,
diff bpdev.bp_real_to_fiskal_reference.diff%TYPE,
f_trx_number bpdev.bp_real_to_fiskal_reference.f_trx_number%TYPE,
f_trx_date bpdev.bp_real_to_fiskal_reference.f_trx_date%TYPE,
f_amount bpdev.bp_real_to_fiskal_reference.f_amount%TYPE,
NULLS bpdev.bp_real_to_fiskal_reference.nulls%TYPE,
notnulls bpdev.bp_real_to_fiskal_reference.notnulls%TYPE,
org_id bpdev.bp_real_to_fiskal_reference.org_id%TYPE);
r_denormalized_data tr_denormalized_data;
lv_where_le_ids VARCHAR2(3000);
lv_sql_str VARCHAR2(5000);
BEGIN
bpdev.bp_utils.put_log('>>>--------ПОТРЕБИТЕЛСКИ СЪОБЩЕНИЯ--------<<<');
bpdev.bp_utils.put_log('Изтриване на старите данни.');
DELETE bpdev.bp_real_to_fiskal_reference rfr;
COMMIT;
lv_where_le_ids := bp_utils.set_where_clause('invr.org_id',
real_legal_entyties_id_list,
',',
';',
0);
lv_sql_str :=
'SELECT invr.customer_trx_id r_customer_trx_id,
invr.trx_number r_trx_number,
invr.trx_date r_trx_date,
round(invr.extended_amount, 2) r_amount,
round(nvl(ps.amount_due_remaining, invr.extended_amount), 2) r_amount_due_rem,
round(invr.amount_without_credits - invf.extended_amount, 3) diff,
invf.trx_number f_trx_number,
invf.trx_date f_trx_date,
round(invf.extended_amount, 2) f_amount,
round(invr.extended_amount +
nvl((SELECT SUM(psa.amount_credited)
FROM ar_payment_schedules_all psa
WHERE psa.customer_trx_id = invr.customer_trx_id),
0) - invf.extended_amount,
1) NULLS,
round(nvl(ps.amount_due_remaining, (invr.extended_amount * 1.2)), 2) notnulls,
invr.org_id
FROM (SELECT cth.customer_trx_id,
cth.trx_number,
cth.trx_date,
SUM(ctl.extended_amount) * 1.2 extended_amount,
round(((SUM(ctl.extended_amount) * 1.2 +
nvl((SELECT SUM(psa.amount_credited)
FROM ar_payment_schedules_all psa
WHERE psa.customer_trx_id = cth.customer_trx_id),
0))),
2) amount_without_credits,
cth.org_id,
nvl(decode(TRIM(ctl.interface_line_attribute13),
0,
NULL,
TRIM(ctl.interface_line_attribute13)),
cth.interface_header_attribute13) interface_line_attribute13
FROM ra_customer_trx_all cth,
ra_customer_trx_lines_all ctl
WHERE cth.customer_trx_id = ctl.customer_trx_id AND
ctl.line_type = ''LINE'' AND
ctl.set_of_books_id = 1001
GROUP BY cth.customer_trx_id,
cth.trx_number,
cth.trx_date,
cth.org_id,
nvl(decode(TRIM(ctl.interface_line_attribute13),
0,
NULL,
TRIM(ctl.interface_line_attribute13)),
cth.interface_header_attribute13)) invr,
(SELECT cth.customer_trx_id,
cth.trx_number,
cth.trx_date,
SUM(ctl.extended_amount) * 1.2 extended_amount,
round(((SUM(ctl.extended_amount) * 1.2 +
nvl((SELECT SUM(psa.amount_credited)
FROM ar_payment_schedules_all psa
WHERE psa.customer_trx_id = cth.customer_trx_id),
0))),
2) amount_without_credits,
cth.org_id,
nvl(decode(TRIM(ctl.interface_line_attribute13),
0,
NULL,
TRIM(ctl.interface_line_attribute13)),
cth.interface_header_attribute13) interface_line_attribute13
FROM ra_customer_trx_all cth,
ra_customer_trx_lines_all ctl
WHERE cth.customer_trx_id = ctl.customer_trx_id AND
ctl.line_type = ''LINE'' AND
cth.set_of_books_id = 2001
GROUP BY cth.customer_trx_id,
cth.trx_number,
cth.trx_date,
cth.org_id,
nvl(decode(TRIM(ctl.interface_line_attribute13),
0,
NULL,
TRIM(ctl.interface_line_attribute13)),
cth.interface_header_attribute13)) invf,
ar_payment_schedules_all ps
WHERE invf.interface_line_attribute13(+) = invr.customer_trx_id AND
ps.customer_trx_id(+) = invr.customer_trx_id AND
invr.trx_date >= SYSDATE - ' ||
days_before_today || ' ' || lv_where_le_ids;
bpdev.bp_utils.put_log('Зареждане на новите данни.');
OPEN c_denormalized_data FOR lv_sql_str;
LOOP
FETCH c_denormalized_data
INTO r_denormalized_data;
EXIT WHEN c_denormalized_data%NOTFOUND;
INSERT INTO bpdev.bp_real_to_fiskal_reference
(r_customer_trx_id,
r_trx_number,
r_trx_date,
r_amount,
r_amount_due_rem,
diff,
f_trx_number,
f_trx_date,
f_amount,
NULLS,
notnulls,
org_id,
data_loaded_for_days)
VALUES
(r_denormalized_data.r_customer_trx_id,
r_denormalized_data.r_trx_number,
r_denormalized_data.r_trx_date,
r_denormalized_data.r_amount,
r_denormalized_data.r_amount_due_rem,
r_denormalized_data.diff,
r_denormalized_data.f_trx_number,
r_denormalized_data.f_trx_date,
r_denormalized_data.f_amount,
r_denormalized_data.nulls,
r_denormalized_data.notnulls,
r_denormalized_data.org_id,
days_before_today);
END LOOP;
COMMIT;
CLOSE c_denormalized_data;
bpdev.bp_utils.put_log('>>>------КРАЙ ПОТРЕБИТЕЛСКИ СЪОБЩЕНИЯ-----<<<');
EXCEPTION
WHEN OTHERS THEN
bpdev.bp_utils.put_log(retcode || errbuf);
END load_denormalized_data;
你爲什麼不調試它? – Moudiz
我們無法看到遊標,數據,參數,手動運行的內容,或者您是否訪問同一模式中的相同表 - 以及是否提交了所有數據。你沒有給出任何預計有多少行,缺少多少行,或者是否有任何常見模式是那些似乎被跳過的模式。爲什麼使用遊標循環(並提交每行!?)而不是動態的「insert ... select」來一次插入所有行? –
你的代碼似乎沒有任何邏輯錯誤。但是,您尚未發佈完整的代碼。幾點:1)你是否在你正在處理和跳過異常的地方編寫了一個異常部分。 2)你是否已經嘗試在你的程序中打印lv_sql_str,然後在SQL中執行查詢,看看你是否得到所有的記錄。 –