2016-06-13 30 views
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; 
+3

你爲什麼不調試它? – Moudiz

+1

我們無法看到遊標,數據,參數,手動運行的內容,或者您​​是否訪問同一模式中的相同表 - 以及是否提交了所有數據。你沒有給出任何預計有多少行,缺少多少行,或者是否有任何常見模式是那些似乎被跳過的模式。爲什麼使用遊標循環(並提交每行!?)而不是動態的「insert ... select」來一次插入所有行? –

+0

你的代碼似乎沒有任何邏輯錯誤。但是,您尚未發佈完整的代碼。幾點:1)你是否在你正在處理和跳過異常的地方編寫了一個異常部分。 2)你是否已經嘗試在你的程序中打印lv_sql_str,然後在SQL中執行查詢,看看你是否得到所有的記錄。 –

回答

0

我們沒有所有的信息,但我懷疑的問題是在這裏

invr.trx_date >= SYSDATE - ' ||  days_before_today || ' ' || lv_where_le_ids; 

嘗試添加你所期望的靜態然後再次嘗試的日期。