Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 在删除列之前选择作为版本_Oracle_Oracle11g_Version_Flashback - Fatal编程技术网

Oracle 在删除列之前选择作为版本

Oracle 在删除列之前选择作为版本,oracle,oracle11g,version,flashback,Oracle,Oracle11g,Version,Flashback,1/是否FLASHBACK和SELECT AS OF/VERSION BETWEEN使用相同的历史来源来回溯?这个问题与第二个问题有关 2/我知道FLASHBACK无法在DDL更改之前返回 我的问题是,对于自起选择,它是否能够在DDL更改之前选择某些内容。 例如 CREATE TABLE T (col1 NUMBER, col2 NUMBER) INSERT INTO T(col1, col2) VALUES('1', '1') INSERT INTO T(col1, col2) VALUES(

1/是否
FLASHBACK
SELECT AS OF/VERSION BETWEEN
使用相同的历史来源来回溯?这个问题与第二个问题有关

2/我知道
FLASHBACK
无法在DDL更改之前返回

我的问题是,对于自起选择,它是否能够在DDL更改之前选择某些内容。 例如

CREATE TABLE T
(col1 NUMBER, col2 NUMBER)
INSERT INTO T(col1, col2) VALUES('1', '1')
INSERT INTO T(col1, col2) VALUES('2', '2')
COMMIT;
SLEEP(15)
ALTER TABLE T DROP COLUMN col2;
SELECT * FROM T
AS OF SYSTIMESTAMP - INTERVAL '10' SECOND;
选择返回2列还是1列


对不起,我手头没有要测试的数据库。

任何改变表结构的DDL都会使该表的任何现有撤消数据无效。因此,您将得到错误“ORA-01466”无法读取数据-表定义已更改

这里有一个简单的测试

CREATE TABLE T
(col1 NUMBER, col2 NUMBER);
INSERT INTO T(col1, col2) VALUES('1', '1');
INSERT INTO T(col1, col2) VALUES('2', '2');
COMMIT;
SLEEP(15)
ALTER TABLE T DROP COLUMN col2;


SELECT * FROM T
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' SECOND);
执行上述select语句时出错ORA-01466

但是,更改表的存储属性的DDL操作不会使撤消数据无效,因此您仍然可以使用flashback查询。

1)
flashback table
SELECT。。从
开始,使用相同的源,撤消。还有
FLASHBACK数据库
——尽管它使用相同的机制,但它使用一个单独的源,FLASHBACK日志必须可选地进行配置

2) 如果启用了

要使用该功能,请在示例代码中添加一些语句:

CREATE FLASHBACK ARCHIVE my_flashback_archive TABLESPACE users RETENTION 10 YEAR;
...
ALTER TABLE t FLASHBACK ARCHIVE my_flashback_archive;
现在,此语句将返回1列:

SELECT * FROM T;
此语句将返回两列:

SELECT * FROM T AS OF SYSTIMESTAMP - INTERVAL '10' SECOND;