PLSQL: вставка FORALL, когда данные НЕ относятся к типу - PullRequest
0 голосов
/ 18 октября 2018

Я хочу использовать FORALL для вставки данных в таблицу.Но в приведенном ниже коде я не смогу получить переменные l_final_amt и l_reference_number вне цикла FOR из l_tbl_table_test_retrieve.

Как использовать FORALL для вставки данных в таблицукогда значения не в данном типе?

CREATE OR REPLACE PACKAGE test_FORALL AS
PROCEDURE pr_test_FORALL;
END test_FORALL;

CREATE OR REPLACE PACKAGE BODY test_FORALL AS
PROCEDURE pr_test_FORALL IS

TYPE ty_tbl_table_test IS TABLE OF table_test%ROWTYPE INDEX BY BINARY_INTEGER;
l_tbl_table_test_retrieve            ty_tbl_table_test;
l_tbl_table_test                     ty_tbl_table_test;
l_final_amt                          INTEGER;
l_reference_number                   VARCHAR2(100);

BEGIN
          SELECT * BULK COLLECT
          INTO   l_tbl_table_test_retrieve
          FROM   table_test t1;

          FOR i IN 1 .. l_tbl_table_test_retrieve.COUNT
          LOOP

          l_tbl_table_test(l_tbl_table_test.COUNT + 1) := l_tbl_table_test_retrieve(i);
          l_final_amt := l_final_amt + 10;
          l_reference_number := SYSDATE + l_tbl_table_test_retrieve(i).ID;

          insert into some_other_table(fname, address,final_amt,ref_number)
          values(l_tbl_table_test_retrieve(i).fname, l_tbl_table_test_retrieve(i).address,l_final_amt,l_reference_number); 

          END LOOP;

        --I want to insert into some_other_table using FORALL. But,l_final_amt and l_reference_number variables
          -- are not available in l_tbl_table_test_retrieve.    

EXCEPTION
DBMS_OUTPUT.put_line('EXCEPTION occurred');

END;

END pr_test_FORALL;
END test_FORALL;

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете преобразовать все это в две вставки приведенной ниже формы в необходимые таблицы.

Я вижу, что в вашем коде l_reference_number определяется как переменная VARCHAR2, но звучит как число,(SYSDATE + some_number) даст тип даты.Он будет неявно преобразован в строку на основе ваших настроек NLS_, когда вы назначите его varchar2.Я не уверен, что вы хотите хранить там как "REFERENCE_NUMBER".

 INSERT INTO some_other_table (
      fname,
      address,
      final_amt,
      ref_number
 )
      SELECT fname,
             address,
             10 * ROWNUM  AS final_amt,
             SYSDATE + id  as reference_number 
      FROM table_test;
0 голосов
/ 18 октября 2018

Используйте курсор и добавьте поля в строки, возвращаемые курсором:

PROCEDURE pr_test_FORALL IS
  DECLARE csrData AS CURSOR FOR
    SELECT t1.*,
           NULL AS COUNT_VAL,
           NULL AS FINAL_AMT,
           NULL AS REFERENCE_NUMBER
      FROM TABLE_TEST t1;

  TYPE ty_tbl_table_test IS
    TABLE OF csrData%ROWTYPE  -- Note: csrData%ROWTYPE
      INDEX BY BINARY_INTEGER;

  l_tbl               ty_tbl_table_test;
  l_final_amt         INTEGER := 0;
  l_reference_number  VARCHAR2(100);
BEGIN
  OPEN csrData

  FETCH csrData
    BULK COLLECT INTO l_tbl;

  CLOSE csrData;

  FOR i IN 1 .. l_tbl.COUNT LOOP
    l_final_amt := l_final_amt + 10;
    l_tbl(i).FINAL_AMT := l_final_amt;
    l_tbl(i).REFERENCE_NUMBER := SYSDATE + l_tbl(i).ID;
  END LOOP;

  FORALL i IN l_tbl.FIRST..l_tbl.LAST
    INSERT INTO SOME_OTHER_TABLE
      (FNAME, ADDRESS, FINAL_AMT, REF_NUMBER)
    VALUES
      (l_tbl(i).FNAME,
       l_tbl(i).ADDRESS,
       l_tbl(i).FINAL_AMT,
       l_tbl(i).REFERENCE_NUMBER);
EXCEPTION
  DBMS_OUTPUT.put_line('EXCEPTION occurred');
END pr_test_FORALL;
...