Я создаю динамическую процедуру, которая могла бы принять 2 таблицы names.Fetch записей из одной таблицы и после определенной записи (скажем, 100 записей), я должен выдать команду фиксации. И tabName, и temp_tabName всегда одинаковы. Поскольку у меня есть миллиарды записей в первой таблице, я делаю фиксацию после каждых 10000 записей, чтобы избавиться от проблемы с табличным пространством отмены.Получение записи по одному динамически Oracle
До сих пор, что я сделал это:
CREATE OR REPLACE PROCEDURE MyProdecure (
tabName IN USER_TABLES.table_name%TYPE,
temp_tabName IN USER_TABLES.table_name%TYPE
)
IS
v_sql VARCHAR2 (100) := 'select * from ' || tabName;
TEMP_CURSOR SYS_REFCURSOR;
COUNT NUMBER (6) := 0;
BEGIN
OPEN TEMP_CURSOR FOR v_sql;
LOOP
FETCH TEMP_CURSOR INTO V_ROW;
--=================================================================================
/*
* I need the code here to fetch the 100 record from TEMP_CURSOR into a Variable
* and insert into the second table. or one record increment the count and if
* count>= 100 commit
*What would be the data type of V_ROW. How to fetch the data from V_ROW and complete the insert into command.
*/
--================================================================================
EXIT WHEN TEMP_CURSOR%NOTFOUND;
END LOOP;
CLOSE TEMP_CURSOR;
END MyProdecure;
Я не уверен, что это именно то, что вы хотите, но вы можете сделать if, чтобы получить {temp_cursor% rowcount = 100}. Это даст вам момент, когда вы доберетесь до 100-й строки, прочитанной. –
Почему 1 за раз? Почему вы не можете обрабатывать весь комплект сразу? Выполняете ли вы дополнительную обработку по каждой из 100 записей? Это просто кажется неэффективным делать это в цикле, если у вас нет дополнительных ограничений. – xQbert
Это вопрос домашнего задания? В целом, совершать партии не является хорошей практикой. – Boneist