Как использовать ретроспективный запрос для получения удаленных строк?

Я пытаюсь протестировать хранимую процедуру, которая удаляет данные из таблицы, и у меня есть настройки, подобные этой:

Установка Oracle:

CREATE TABLE table_name ( id NUMBER );

Скрипт PL/SQL:

DECLARE
  v_scn V$DATABASE.CURRENT_SCN%TYPE;
  v_row TABLE_NAME%ROWTYPE;
BEGIN
  INSERT INTO table_name VALUES ( 1 );
  INSERT INTO table_name VALUES ( 2 );
  INSERT INTO table_name VALUES ( 3 );

  SELECT current_scn INTO v_scn FROM V$DATABASE;

  -- call a procedure with side-effects such as:
  DELETE FROM table_name WHERE id = 1;

  SELECT *
  INTO   v_row
  FROM   (
    SELECT * FROM table_name AS OF SCN( v_scn )
  MINUS
    SELECT * FROM table_name
  );

  DBMS_OUTPUT.PUT_LINE( 'One row deleted: ' || v_row.id );
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE( 'Not found' );
  WHEN TOO_MANY_ROWS THEN
    DBMS_OUTPUT.PUT_LINE( 'Too many rows' );
END;

ROLLBACK;

Я ожидаю, что v_row будет заполнен одной строкой, и ни один из обработчиков исключений не будет вызван. Тем не менее NO_DATA_FOUND исключение вызывается.

  • Почему это не работает?
  • Как я могу использовать ретроспективный запрос, чтобы определить, какие строки были удалены?

0 ответов

Другие вопросы по тегам