oracle小技巧

1、oracle分頁

      1)select * from (select a.*, rownum rn from (select * from tabel order by XX) a where rownum<5) where rn>2;

             注:在oracle中用rownum來記錄數據的順序,這個語句的意思是,按某個字段排序並查找出表中所有數據,根據數據的順

                    序,先找出數據排序號小於5的數據,然後再找到大於2的數據。

        2)select * from emp where rowid in (select rid from (select rownum rn,rid from (select rowid rid from table order by XX) a 

              where  rownum<=5)  where rn>=2) 

             注:這裏是根據rowid來查找數據,由於這個語句子查詢查找的字段很少,故有人認爲他的速度比較快。但這裏有一個小問

                    題,就是當這個語 句和上面的語句按相同列排序,兩條sql查出的數據並不相同,具體什麼原因我也不清楚,請知道的

                    大神告知一下。


2、delete和truncate的區別

         delete是DML(數據操作語言),該操作會放在rollback segement中,提交了事物才生效,如果用相應的trigger,執行時將

     會被 觸發。truncate是DDL(數據定義語言),該操作執行時立即生效,原數據並沒放在rollback segement中,沒有回滾一說,

     也不 觸發trigger。

     注:當批量刪除數據時,建議用truncate,速度較快,但也存在一定的安全隱患


3、oracel表解鎖

       1)找到被鎖定表的session

            SELECT object_name, machine, s.sid, s.serial# 

                   FROM gv$locked_object l, dba_objects o, gv$session s 

               WHERE l.object_id= o.object_id 

                     AND l.session_id = s.sid; 

        2)釋放session,進行解鎖

            ALTER system kill session 'XX, XXXXX'; 


4、表空間

   1)作用:控制數據庫所佔的磁盤空間;分類管理,提供效率;備份和恢復數據

     2)創建表空間

           create tablespace 表空間名 datafile ‘D:\xxx.dbf size 20m;

           注:xxx.dbf爲數據文件名,size最大值爲500m

     3)擴大表空間

           a、添加數據文件:alert tablespace 表空間名 add datafile ‘D:\xxx2.dbf’ size 20m;

           b、增加數據文件大小:alert tablespace 表空間名 ‘D:\xxx .dbf’ resize 20m;

            注:當你不知道對應的數據文件在哪個位置,可通過一下SQL查詢出對應的位置:

            select f.* from dba_data_files f where f.tablespace_name='表空間名'

           c、設置文件自動增長:alert tablespace 表空間名 ‘D:\xxx.dbf’autoextend on next 10m  maxsize  500m;

     4)改變表空間狀態

           聯機:alert tablespace 表空間名 online

           脫機:alert tablespace 表空間名 offline

          只讀:alert  tablespace 表空間名 read only

          讀寫:alert  tablespace 表空間名 read write

      5)移動表空間數據文件

            a、確定數據文件的表空間: select tablespace_name from dba_data_files where file_name=d:\XXX.dbf’;

            b、使表空間脫機: alert  tablespace 表空間名 offline

            c、移動數據文件到制定位置:host move d:\xxx.dbf c:\xxx.dbf

            d、邏輯修改數據文件:alert  tablespace 表空間名 rename datafile ‘d:\xxx.dbf’ to ‘c:\xxx.dbf’

            e、使表空間聯機:alert tablespace 表空間名 online 


5、查找某個字段在數據庫中的哪些表出現

             select  *  from user_tab_columns uc,user_tables ut

         where ut.table_name=uc.TABLE_NAME 

            and column_name =upper('BOX_NO') ;


6、數據庫字符串分割

             1)定義返回類型

                   CREATE OR REPLACE TYPE split_type IS TABLE OF VARCHAR2 (4000);

             2)實現分割方法

                  CREATE OR REPLACE FUNCTION split (

                             p_str       IN VARCHAR2,

                             p_delimiter IN VARCHAR2 default(','))

                             RETURN split_type

                  IS

                             j INT := 0;

                             i INT := 1;

                             len INT := 0;

                             len1 INT := 0;

                             str VARCHAR2 (4000);

                             my_split split_type := split_type ();

                  BEGIN

                           len := LENGTH (p_str);

                           len1 := LENGTH (p_delimiter);

                   

                          WHILE j < len  LOOP

                                 j := INSTR (p_str, p_delimiter, i);

                      

                                IF j = 0  THEN

                                    j := len;

                                   str := SUBSTR (p_str, i);

                                  my_split.EXTEND;

                                  my_split (my_split.COUNT) := str; 

                                  IF i >= len THEN

                                        EXIT;

                                  END IF;

                             ELSE

                                   str := SUBSTR (p_str, i, j - i);

                                   i := j + len1;

                                   my_split.EXTEND;

                                   my_split (my_split.COUNT) := str;

                             END IF;

                      END LOOP;

                      RETURN my_split;

                  END split;

           3)循環獲取分割內容

                 for m in ( select * from table(split(strLabelLNoList,'|')) ) loop

                       .......

                 end loop;

  











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章