1

テーブルからデータを削除するストアド プロシージャをテストしようとしていますが、次のような設定になっています。

オラクルのセットアップ:

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例外が呼び出されています。

  • なぜ機能しないのですか?
  • フラッシュバック クエリを使用して、削除された行を特定するにはどうすればよいですか?
4

0 に答える 0