运行环境:SQLPLUS, SERVEROUTPUT已打开
下列语句创建了表和数据:
CREATE TABLE plch_products
(
id NUMBER
, name VARCHAR2 (10)
)
/
BEGIN
INSERT INTO plch_products (id, name)
VALUES (1, 'Mouse');
COMMIT;
END;
/
我成功地编译了下列过程:
CREATE OR REPLACE PROCEDURE plch_change_name
IS
v_scn NUMBER;
v_name plch_products.name%TYPE;
BEGIN
UPDATE plch_products
SET name = 'Keyboard'
WHERE id = 1;
COMMIT;
UPDATE plch_products
SET name = 'Monitor'
WHERE id = 1;
v_scn := DBMS_FLASHBACK.get_system_change_number;
SELECT name
INTO v_name
FROM plch_products AS OF SCN v_scn
WHERE id = 1;
DBMS_OUTPUT.put_line (v_name);
COMMIT;
END;
/
我执行这个代码块之后屏幕上会显示什么?
BEGIN
plch_change_name ();
END;
/
查询返回的值是 "Keyboard"。
即使name这个列的值被修改成"Monitor",并且这个值被设置了好几秒钟,其返回的值是那个已提交过的,而非当前活跃的事务中所设置的那个值。
正如Oracle文档中所言:
闪回查询“返回的是指定时间点当时已被提交的数据”。
为了利用闪回查询功能,你需要DBMS_FLASHBACK的执行权限赋予你的schema。你还需要和DBA密切合作,来决定这个功能可以让你闪回到多远,以及在应用中通常如何使用。