如何捕获并使用更新列值?

时间:2018-11-22 11:33:06

标签: oracle plsql oracle-sqldeveloper oracle12c plsqldeveloper

嗨,我有一个方案,如果满足更新验证,使用游标循环获取所有发票值并检查详细信息并将标志值更新为“ E”,并且仅将这些发票插入不满足要求的另一个表中更新语句。

有没有一种方法可以根据标志值插入这些发票?

请找到代码:

Procedure 
 CURSOR c2
      IS
         SELECT *
           FROM invoice_tl
          WHERE process_flag = 'N';           
BEGIN
     FOR rec IN c2
     LOOP
     BEGIN

        fnd_file.put_line (fnd_file.LOG, 'The Line Number is ' || ' ' || rec.line_number);

           IF rec.line_number IS NOT NULL
           THEN

              UPDATE invoice_tl
                 SET process_flag = 'E',
                     error_description =
                        (SELECT 'Credit Memo line amount cannot be more than Invoice Line Amount : '
                        || (rctl.extended_amount
                                    - NVL (
                                         (SELECT SUM (amount)
                                            FROM ar_activity_details
                                           WHERE customer_trx_line_id =
                                                    rctl.customer_trx_line_id),
                                         0)
                                    + NVL (
                                         (SELECT SUM (extended_amount)
                                            FROM ra_customer_trx_lines_all
                                           WHERE previous_customer_trx_line_id =
                                                    rctl.customer_trx_line_id),
                                         0))
                           FROM ra_customer_trx_all rct,
                                ra_customer_trx_lines_all rctl
                          WHERE rct.customer_trx_id =
                                   rctl.customer_trx_id
                                AND rct.org_id = 2326
                                AND rct.trx_number = rec.invoice_number
                                AND rctl.line_number = rec.line_number
                                AND rct.cust_trx_type_id =
                                       ln_trans_type_id)
               WHERE process_flag = 'N'
                     AND invoice_number = rec.invoice_number
                     AND line_number = rec.line_number
                     AND amount >
                             (SELECT (rctl.extended_amount
                                     - NVL (
                                          (SELECT SUM (amount)
                                             FROM ar_activity_details
                                            WHERE customer_trx_line_id =
                                                     rctl.customer_trx_line_id),
                                          0)
                                     + NVL (
                                          (SELECT SUM (extended_amount)
                                             FROM ra_customer_trx_lines_all
                                            WHERE previous_customer_trx_line_id =
                                                     rctl.customer_trx_line_id),
                                          0))
                               FROM ra_customer_trx_all rct,
                                    ra_customer_trx_lines_all rctl
                              WHERE rct.customer_trx_id =
                                       rctl.customer_trx_id
                                    AND rct.org_id = 2326
                                    AND rct.trx_number =
                                           rec.invoice_number
                                    AND rctl.line_number =
                                           rec.line_number
                                    AND rct.cust_trx_type_id =
                                           ln_trans_type_id);

              fnd_file.put_line (
                 fnd_file.LOG,
                 'Error Message if the CM amount more than the Invoice Line amount.');
              COMMIT;
           END IF;
        END;

        BEGIN
         fnd_file.put_line (
                 fnd_file.LOG,
                 'The Process FLag is : ' || rec.process_flag);        
           INSERT INTO second_table (
                          customer_number,
                          orig_system_cust_reference,
                          orig_system_add_reference,
                          customer_name,
                          locations,
                          inv_date,
                          creation_date,
                          inv_num,
                          balance_amount,
                          customer_trx_id,
                          customer_trx_line_id,
                          NAME,
                          term_desc,
                          term_id,
                          gl_date,
                          rec_segments1,
                          rec_segments2.....
       END;
    END LOOP;    
END

1 个答案:

答案 0 :(得分:0)

您最好的选择是使用RETURNING INTO子句。因此,您将定义一个数组并捕获更新行的相应部分:

declare
    type line_number_tt is table of invoice_tl.line_number%TYPE;
    line_number_array line_number_tt;
begin
    ....

    update invoice_tl 
    ...
    returning line_number bulk collect into line_number_array;

    [do stuff with the array here]
end;

如果可以的话,我会尽力摆脱现有的“选择-然后-循环”。那是逐行处理,并且有一个原因称为“逐个缓慢”。