Oracle数据删除恢复和数字与字符串之间的转换
1. 如何删除标准临时表?
举例:
------创建临时表
CREATE GLOBAL TEMPORARY TABLE t1
ON COMMIT PRESERVE ROWS AS
SELECT * FROM dual;
------删除临时表
TRUNCATE TABLE t1;
DROP TABLE t1;
2. drop删除的表如何恢复
(1)delete删除表记录行
对当次操作,及时补救措施即为rollback;当前提是不能有显示的commit或者隐式的commit语句。
举例一:回退成功的例子
SQL> select count(*) from t1;
COUNT(*)
----------
2640
SQL> delete from t1;
已删除2640行。
SQL> rollback;
回退已完成。
SQL> select count(*) from t1;
COUNT(*)
----------
2640
举例二:回退失败的例子
SQL> select count(*) from t1;
COUNT(*)
----------
2640
SQL> delete from t1;
已删除2640行。
SQL> commit;
提交完成。
SQL> select count(*) from t1;
COUNT(*)
----------
0
SQL> rollback;
回退已完成。
SQL> select count(*) from t1;
COUNT(*)
----------
0
举例三:回退失败的例子
SQL> select count(*) from t1;
COUNT(*)
----------
2640
SQL> delete from t1;
已删除2640行。
SQL> create table t11 as select * from dual;
表已创建。
SQL> rollback;
回退已完成。
SQL> select count(*) from t1;
COUNT(*)
----------
0
注:DML语句是insert ,update, delete --->这个是要COMMIT才能存储在ORACLE数据库里;
DDL语句,是系统自动提交的,不需要你手动COMMIT;
(2)drop删除表
用闪回操作恢复数据(要求:回收站数据没被删除)
举例:
Step1:误删表
SQL> select count(*) from
COUNT(*)
----------
2640
SQL> drop table t1;
表已删除。
Step2: 在表回收站查看是否有删除表信息
SQL> select * from recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION
------------------------------ -------------------------------- ---------
TYPE TS_NAME CREATETIME
------------------------- ------------------------------ -------------------
DROPTIME DROPSCN PARTITION_NAME CAN CAN
------------------- ---------- -------------------------------- --- ---
RELATED BASE_OBJECT PURGE_OBJECT SPACE
---------- ----------- ------------ ----------
BIN$xiLonmibSl+XC749TXPv6A==$0 T1 DROP
TABLE USERS 2015-04-29:11:46:58
2015-04-30:13:45:59 69114325 YES YES
224295 224295 224295 8
Step3: 恢复数据
SQL> flashback table t1 to before drop;
闪回完成。
SQL> select count(*) from t1;
COUNT(*)
----------
2640
数据恢复完成。
注:
(1)相关的技术还有很多,有待进一步补充!
(2)清空表回收站语句:PURGE RECYCLEBIN;
3. 快速删除表所有数据行,并保留表结构?
用 truncate table table_name;而避免用delete from table_name。
4. 数据库DML与DDL区别?
SCN(系统改变号),它的英文全拼为:System Change Number,它是数据库中非常重要的一个数据结构。SCN提供了Oracle的内部时钟机制,可被看作逻辑时钟,这对于恢复操作是至关重要的
注释:Oracle 仅根据 SCN 执行恢复。
它定义了数据库在某个确切时刻提交的版本。在事物提交时,它被赋予一个唯一的标示事物的SCN。一些人认为 SCN是指, System Commit Number,而通常 SCN在提交时才变化,所以很多情况下,这两个名词经常被交替使用。
方法一:案例测试
Step1:不小心删除了表中的数据,并提交了(commit)
SQL> select count(*) from t1;
COUNT(*)
----------
2640
SQL> delete from t1;
已删除2640行。
SQL> commit;
提交完成。
SQL> select count(*) from t1;
COUNT(*)
----------
0
Step2: 获得当前的SCN
如果能够确切知道删除之前SCN最好,如果不知道,可以进行闪回查询尝试.
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
69117175
SQL> select count(*) from t1 as of scn 69117175;
COUNT(*)
----------
0
SQL> select count(*) from t1 as of scn 69116888;
COUNT(*)
----------
2640
可以看到在SCN=69116888时,数据都在。
Step3: 恢复数据
SQL> insert into t1 select * from t1 as of scn 69116888;
已创建2640行。
方法二:案例测试
Step1: 误删数据,并commit
SQL> select count(*) from t1;
COUNT(*)
----------
2640
SQL> delete from t1;
已删除2640行。
SQL> commit;
提交完成。
SQL> select count(*) from t1;
COUNT(*)
----------
0
Step2: 误删数据后的还原
SQL> select timestamp_to_scn(to_timestamp('2015-04-30 15:00:00','yyyy-mm-dd hh24:mi:ss')) from dual;
TIMESTAMP_TO_SCN(TO_TIMESTAMP('2015-04-3015:00:00','YYYY-MM-DDHH24:MI:SS'))
---------------------------------------------------------------------------
69118620
SQL> select count(*) from t1 as of scn 69118620;
COUNT(*)
----------
2640
SQL> insert into t1 select * from t1 as of scn 69118620;
已创建2640行。
6. oracle中如何将数字转换成字符型?
补充知识:
Oracle中格式化参数FM的意义:
You will notice that in some examples, the format_mask parameter begins with "FM". This means that zeros and blanks are suppressed.
在格式参数FMT中,前面加上FM代表去掉返回结果中的前后空格和0。
SQL> SELECT to_char(SYSDATE,'mm,day') FROM dual;
TO_CHAR(SYSD
------------
04,星期四
SQL> SELECT to_char(SYSDATE,'fmmm,day') FROM dual;
TO_CHAR(SYSD
------------
4,星期四
举例:数值转化
SQL> select '1:'||to_char(0.12345,'99900.00') NUM from dual;
NUM
-----------
1: 00.12
SQL> select '1:'||to_char(0.12345,'00.00') NUM from dual;
NUM
--------
1: 00.12
SQL> select '1:'||to_char(0.12345,'FM00.00') NUM from dual;
NUM
--------
1:00.12
SQL> select '1:'||to_char(0.12345,'FM990.00') NUM from dual;
NUM
---------
1:0.12
SQL> select '1:'||to_char(34.12345,'FM990.00') NUM from dual;
NUM
---------
1:34.12
SQL> select '1:'||to_char(12334.12345,'FM990.00') NUM from dual;
NUM
---------
1:#######