Oralce小技巧2

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

注意:快照表是可以更改的,但是更改后是不会在和源表同步的,除非你更改的哪个信息在源表中又更改过。

你可能感兴趣的:(oracle,sql,中国移动)