Как мне зафиксировать значение столбца обновления и использовать его? - PullRequest
0 голосов
/ 22 ноября 2018

Привет У меня есть сценарий, в котором при использовании цикла курсора получают все значения счета, проверяют детали и обновляют значения флага до '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 голосов
/ 23 ноября 2018

Лучше всего использовать предложение 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;

Я бы действительно попытался избавиться от имеющегося у вас выбора, а затем цикла, если вы можете.Это построчная обработка, и есть причина, по которой она называется «медленно-медленно».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...