1. Dbv检查坏块
Dbv file=users01.dbf blocksize=8192
2. 动态sql写的时候注意
sql_stat:='ALTER TABLE '||p_r.TABLE_NAME||' MODIFY CONSTRAINT '||p_r.CONSTRAINT_NAME||' DISABLE';
execute immediate sql_stat;
注意红色字后面和前面是有空格的不然连在一起是不行的。||和’之间不要有空格要不它的功能就会失效。
3. 把汉字转化成ascii在转会来
SQL> select unistr('\4E2D\56FD') from dual;
UNIS
中国
SQL> select asciistr('中国') from dual;
ASCIISTR('
----------
\4E2D\56FD
4. 查询和闪回表以前的数据
查询该表一分钟前的数据(delete /updae/insert操作后)
select * from abc as of TIMESTAMP SYSDATE-1/1440;
insert into abc select * from abc as of TIMESTAMP SYSDATE-1/1440;
在这种误删除数据的情况下,应该事先激活表的行移动特征,如:
ALTER TABLE emp ENABLE ROW MOVEMENT;
ALTER TABLE emp DISABLE ROW MOVEMENT;
FLASHBACK TABLE b to timestamp to_timestamp('2007-08-28 11:14:00','yyyy-mm-dd hh24:mi:ss'); //我试过,可以
FLASHBACK TABLE cc
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '01' minute);
//我也史过可以,而且这种好一点,闪回一分钟以前的数据。
闪回表:drop 操作后
SELECT object_name, original_name FROM user_recyclebin;
SHOW recyclebin
desc "BIN$LS3MyjLQRcXgQAB/AQA8Ow==$0"
FLASHBACK TABLE tablename TO BEFORE DROP;
5. 注意,在存储过程中要涉及很多表,但表中的字段修改:如修改类型,大小等,都有可能使存储过程实效,所以要看看存储过程,重新编译一下。
6. 如果设置了默认值,那么以前的数据中有空的,则这个数据在update的时候是不变的,记住,这个是不报错的,直到了,才发现许多数据都丢失了。
7. 如何取得Oracle当前会话的编号(Session ID)?
SQL>SELECT SID FROM V$MYSTAT WHERE ROWNUM =1;
SID
----------
19949
Select * from V$MYSTAT;可以查出当前session的所有统计信息。
下面一个更简单, 但只能在Oracle 10g及以上版本中使用.
SQL> SELECT USERENV('SID') FROM DUAL;
USERENV('SID')
--------------
19949
下面这个方法我有时也用, 因为不想用最上面的SQL去写一个子查询, 发现在Oracle 9i上很正常, 但在Oracle 10g上常常返回两行, 因此不能再使用它了.
SQL> SELECT SID FROM V$SESSION WHERE AUDSID=USERENV('SESSIONID');
SID
----------
19949
8. 如何查出前台正在发出的sql语句
select user_name,sql_text
from v$open_cursor
|
|||
where sid in (select sid from (select sid,serial from v$session
where status='ACTIVE'))
9. Oracle快照
1 源库:Create snapshot log on b; //快速刷新时使用
2 目标库:Create database link snop_b Connect to wang identified by wang using 'oe';
3 目标库:Create snapshot sn_b as select * from b@snop_b;
//会创建一个叫sn_b的表,里面的数据就是b中同步过来的数据。
4 目标库:Alter snapshot sn_b refresh fast Start with sysdate+10/8640 next sysdate+1;
//自动刷新,设定 oracle 自动在 10 钞 (10/24*60*60) 后进行第一次完全刷新,以后每隔 1 天完全刷新一次。 注意好象写成10/24*60*60不行,数据不进行同步,所以我写成10/8640就可以了,以后在试试。
begin
dbms_refresh.refresh('sn_b');
end; //手动刷新
把fast改成complete就是完全刷新,快速刷新比完全刷新快,因为快速刷新将主数据库的数据经网络发送到快照的数据少,仅需传送主表中修改过的数据,而完全刷新要传送快照查询的全部结果。 //详见oracle zongjie
注意:快照表是可以更改的,但是更改后是不会在和源表同步的,除非你更改的哪个信息在源表中又更改过。