У меня есть процедура, из которой я вставляю в 6 таблиц, используя BULK COLLECT.Это работает на основе интервала дат.Процедура вставляется в 3 таблицы, но пропускает вставку на 3 больших таблицы.Моя процедура такова:
CREATE OR REPLACE PROCEDURE MULTI_INSERT
IS
--Variable for rowtype (I assigned only one for all tables, because they have same construction - size and columns - just different names)
TYPE aa IS TABLE OF Table1%ROWTYPE INDEX BY PLS_INTEGER;
my_insert aa;
--Dates
first_day DATE;
this_day DATE := SYSDATE;
--Variable for deleting tables & checking if table has rows
No_of_records NUMBER;
Delete_tables VARCHAR(5):= to_char(SYSDATE, 'dd.mm');
BEGIN
--Delete tables in January
IF Delete_tables = '10.01' THEN
EXECUTE IMMEDIATE 'TRUNCATE TABLE Table1';
EXECUTE IMMEDIATE 'TRUNCATE TABLE Table2';
EXECUTE IMMEDIATE 'TRUNCATE TABLE Table3';
EXECUTE IMMEDIATE 'TRUNCATE TABLE Table4';
EXECUTE IMMEDIATE 'TRUNCATE TABLE Table5';
EXECUTE IMMEDIATE 'TRUNCATE TABLE Table6';
END IF;
BEGIN --Insert of 1st table
--check number of records - function
No_of_records :=empty_table('Table1');
IF No_of_records = 1 then
SELECT MAX(DATUM) +1 into first_day FROM Table1;
ELSIF No_of_records = 0 then
SELECT TRUNC(SYSDATE,'YEAR') "First Day" INTO first_day FROM Dual ;
END IF;
SELECT... --queries are different in each BEGIN END block !
FORALL i IN 1..my_insert.LAST
INSERT INTO Table1 (Name,Surname,Address,Join_Year,Start_Date)
VALUES(my_insert(i).Name,my_insert(i).Surname,my_insert(i).Address,my_insert(i).join_Year,my_insert(i).Start_Date);
COMMIT;
END;
BEGIN
--...And so on...Same code, just different queries for inserts into different tables...
COMMIT;
END;
END MULTI_INSERT;
/
Что может быть причиной пропуска вставок?... Как вы, наверное, заметили, я не присваиваю null my_insert после каждой вставки, но я читал, что BULK COLLECT делает это автоматически перед извлечением данных.И я также написал BEGIN END блок для каждой вставки, с желанием не останавливать другие вставки, если одна из них выходит из строя (но я не совсем уверен, если это так).