вы можете пересмотреть свой дизайн, если вы используете динамический sql для изменения таблицы "dest" в тысячах обновлений.
Намного лучше узнать свое назначение и использовать переменные связывания для условий where.тогда вы можете фиксировать каждые x строк, используя мод или аналогичные:
if (mod(v_ctr, 1000) = 0) then
commit;
end if;
Но для вашего примера Марцин прав, если вы обновляете только 1 строку за раз, тогда
if SQL%ROWCOUNT > 1
никогда не будет истинным;
РЕДАКТИРОВАТЬ: простой пример, зная вашу таблицу "dest":
declare
cursor sel_cur is
select col1, col2, from sourceTable where col3 = 'X';
v_ctr pls_integer := 0;
begin
for rec in sel_cur
loop
v_ctr := v_ctr + 1;
-- implicit bind variables used
update destTable
set col1 = rec.col1,
col2 = rec.col2
where col3 = 'Z';
if (mod(v_ctr, 1000) = 0) then
commit;
end if;
end loop;
exception
when others then rollback;
raise;
end;
Если используется динамический SQL, простой пример с использованием явных переменных связывания (предложение USING)Документы Oracle:
CREATE OR REPLACE PROCEDURE raise_emp_salary (column_value NUMBER,
emp_column VARCHAR2, amount NUMBER) IS
v_column VARCHAR2(30);
sql_stmt VARCHAR2(200);
BEGIN
-- determine if a valid column name has been given as input
SELECT COLUMN_NAME INTO v_column FROM USER_TAB_COLS
WHERE TABLE_NAME = 'EMPLOYEES' AND COLUMN_NAME = emp_column;
sql_stmt := 'UPDATE employees SET salary = salary + :1 WHERE '
|| v_column || ' = :2';
EXECUTE IMMEDIATE sql_stmt USING amount, column_value;
IF SQL%ROWCOUNT > 0 THEN
DBMS_OUTPUT.PUT_LINE('Salaries have been updated for: ' || emp_column
|| ' = ' || column_value);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE ('Invalid Column: ' || emp_column);
END raise_emp_salary;
/
Для получения дополнительной информации см. здесь .
Надеюсь, это поможет, счастливое кодирование