2016-06-13 29 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; 

尝试添加你所期望的静态然后再次尝试的日期。