熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

心得共享:Oracle經驗技巧集錦

2013-11-13 12:45:58  來源: Oracle 

  .刪除表空間
  DROP TABLESPACE TableSpaceName [INCLUDING CONTENTS [AND DATAFILES]]
  
  .刪除用戶
  DROP USER User_Name CASCADE
  .刪除表的注意事項
  
  在刪除一個表中的全部數據時須使用TRUNCATE TABLE 表名;因為用DROP TABLEDELETE * FROM 表名時TABLESPACE表空間該表的占用空間並未釋放反復幾次DROPDELETE操作後該TABLESPACE上百兆的空間就被耗光了
  
  .having子句的用法
  having子句對group by子句所確定的行組進行控制having子句條件中只允許涉及常量聚組函數或group by 子句中的列
  
  .外部聯接+的用法
  外部聯接+按其在=的左邊或右邊分左聯接和右聯接若不帶+運算符的表中的一個行不直接匹配於帶+預算符的表中的任何行則前者的行與後者中的一個空行相匹配並被返回若二者均不帶+則二者中無法匹配的均被返回利用外部聯接+可以替代效率十分低下的 not in 運算大大提高運行速度例如下面這條命令執行起來很慢
  
  用外聯接提高表連接的查詢速度
  
  在作表連接(常用於視圖)時常使用以下方法來查詢數據:
  
  SELECT PAY_NO PROJECT_NAME
  FROM A
  WHERE APAY_NO NOT IN (SELECT PAY_
  NO FROM B WHERE VALUE >=);
   但是若表A有條記錄表B有條記錄則要用掉分鐘才能查完主要因為NOT IN要進 行一條一條的比較共需要*次比較後才能得到結果該用外聯接後可以縮短到分左右的時間:
  
  SELECT PAY_NOPROJECT_NAME
  FROM AB
  WHERE APAY_NO=BPAY_NO(+)
  AND BPAY_NO IS NULL
  AND BVALUE >=;
  
  .set transaction命令的用法
  在執行大事務時有時oracle會報出如下的錯誤:
  
  ORA:snapshot too old (rollback segment too small)
  
  這說明oracle給此事務隨機分配的回滾段太小了這時可以為它指定一個足夠大的回滾段以確保這個事務的成功執行例如
  
  set transaction use rollback segment roll_abc;
  delete from table_name where
  commit;
  回滾段roll_abc被指定給這個delete事務commit命令則在事務結束之後取消了回滾段的指定
  
  .數據庫重建應注意的問題
  在利用import進行數據庫重建過程中有些視圖可能會帶來問題因為結構輸入的順序可能造成視圖的輸入先於它低層次表的輸入這樣建立視圖就會失敗要解決這一問題可采取分兩步走的方法:首先輸入結構然後輸入數據命令舉例如下 (uesrname:jfclpassword:hfjfhost sting:ora數據文件:expdatadmp):
  
  imp jfcl/hfjf@ora file=empdatadmp rows=N
  imp jfcl/hfjf@ora file=empdatadmp full=Y buffer=
  commit=Y ignore=Y
  第一條命令輸入所有數據庫結構但無記錄第二次輸入結構和?字節提交一次ignore=Y選項保證第二次輸入既使對象存在的情況下也能成功
  
  select aempno from emp a where aempno not in (select empno from emp where job=SALE);
  倘若利用外部聯接改寫命令如下:
  
  select aempno from emp a emp b
  where aempno=bempno(+)
  and bempno is null
  and bjob=SALE;
  可以發現運行速度明顯提高
  
  .從已知表新建另一個表
  CREATE TABLE b
  AS SELECT * (可以是表a中的幾列)
  FROM a
  WHERE lumn = ;
  
  .查找刪除重復記錄:
  法一: 用Group by語句 此查找很快的
  
  select count(num) max(name) from student 查找表中num列重復的列出重復的記錄數並列出他的name屬性
  group by num
  having count(num) > 按num分組後找出表中num列重復即出現次數大於一次
  delete from student(上面Select的)
  這樣的話就把所有重復的都刪除了慎重
  
  法二:當表比較大(例如萬條以上)時這個方法的效率之差令人無法忍受需要另想辦法:
  
   執行下面SQL語句後就可以顯示所有DRAWING和DSNO相同且重復的記錄
  
  SELECT * FROM EM_PIPE_PREFAB
  WHERE ROWID!=(SELECT MAX(ROWID) FROM EM_PIPE_PREFAB D D相當於FirstSecond
  WHERE EM_PIPE_PREFABDRAWING=DDRAWING AND
  EM_PIPE_PREFABDSNO=DDSNO);
   執行下面SQL語句後就可以刪除所有DRAWING和DSNO相同且重復的記錄
  
  DELETE FROM EM_PIPE_PREFAB
  WHERE ROWID!=(SELECT MAX(ROWID) FROM EM_PIPE_PREFAB D
  WHERE EM_PIPE_PREFABDRAWING=DDRAWING AND
  EM_PIPE_PREFABDSNO=DDSNO);
  
  .返回表中[NM]條記錄
  取得某列中第N大的行
  
  select column_name from
  (select table_name*dense_rank() over (order by column desc) rank from table_name)
  where rank = &N
  假如要返回前條記錄
  
  select * from tablename where rownum<;(或是rownum <= 或是rownum != )
  假如要返回第條記錄
  
  select * from tablename
  where …
  and rownum<
  minus
  select * from tablename
  where …
  and rownum<
  order by name
  選出結果後用name排序顯示結果(先選再排序)
  
  注意只能用以上符號(<<=!=)
  
  select * from tablename where rownum != ;返回的是前9條記錄
  不能用>>==Betweenand由於rownum是一個總是從開始的偽列Oracle 認為這種條件 不成立查不到記錄
  
  另外這個方法更快
  
  select * from (
  select rownum ra from yourtable
  where rownum <=
  order by name )
  where r >
  這樣取出第條記錄!(先選再排序再選)
  
  要先排序再選則須用select嵌套內層排序外層選
  
  rownum是隨著結果集生成的一旦生成就不會變化了同時生成的結果是依次遞加的沒有就永遠不會有!
  
  rownum 是在 查詢集合產生的過程中產生的偽列並且如果where條件中存在 rownum 條件的話則:
  
   假如 判定條件是常量
  
  只能 rownum = <= 大於 的自然數 = 大於 的數是沒有結果的 大於一個數也是沒有結果的
  
  即 當出現一個 rownum 不滿足條件的時候則 查詢結束   this is stop key!
  
  : 當判定值不是常量的時候
  
  若條件是 = var 則只有當 var 為 的時候才滿足條件這個時候不存在 stop key 必須進行 full scan 對每個滿足其他where條件的數據進行判定
  
  選出一行後才能去選rownum=的行……
  
  獨家披露XP SP制作全程多圖 ·劃時代創舉?Longhorn將支離破碎
  搜狗G郵箱與Gmail大比拼! ·微軟未來娛樂星MSN Wave前曕(圖)
  玩轉音頻!音量控制也很酷 ·Firefox神秘武器():妙用書簽
  用MSN Msg發大表情嚇MM一跳 ·玩轉視頻!DIY萬能播放的WMP
  DS Max光線跟蹤渲染全攻略 ·電腦設計大師之路選區詳解
  《老鼠愛大米》中學演繹版! ·簡約精美!MAC風格屏保
  
  獨家披露XP SP制作全程多圖 ·劃時代創舉?Longhorn將支離破碎
  搜狗G郵箱與Gmail大比拼! ·微軟未來娛樂星MSN Wave前曕(圖)
  玩轉音頻!音量控制也很酷 ·Firefox神秘武器():妙用書簽
  用MSN Msg發大表情嚇MM一跳 ·玩轉視頻!DIY萬能播放的WMP
  DS Max光線跟蹤渲染全攻略 ·電腦設計大師之路選區詳解
  《老鼠愛大米》中學演繹版! ·簡約精美!MAC風格屏保
  
  .快速編譯所有視圖
  
   當在把數據庫倒入到新的服務器上後(數據庫重建)需要將視圖重新編譯一遍因為該表空間視圖到其它表空間的表的連接會出現問題可以利用PL/SQL的語言特性快速編譯
  
  SQL >SPOOL ONSQL
  SQL >SELECT ALTER VIEW ||TNAME||
  COMPILE; FROM TAB;
  SQL >SPOOL OFF
  然後執行ONSQL即可
  
  SQL >@ONSQL
  
  當然授權和創建同義詞也可以快速進行
  
  SQL >SELECT GRANT SELECT ON
  ||TNAME|| TO USERNAME; FROM TAB;
  SQL >SELECT CREATE SYNONYM
  ||TNAME|| FOR USERNAME||TNAME||; FROM TAB;
  
  .讀寫文本型操作系統文件
   在PL/SQL 以上的版本中UTL_FILE包允許用戶通過PL/SQL讀寫操作系統文件如下
  
  DECALRE
  FILE_HANDLE UTL_FILEFILE_TYPE;
  BEGIN
  FILE_HANDLE:=UTL_FILEFOPEN(
  C:\TESTTXTA);
  UTL_FILEPUT_LINE(FILE_HANDLE
  HELLOITS A TEST TXT FILE);
  UTL_FILEFCLOSE(FILE_HANDLE);
  END;
  
  .在數據庫觸發器中使用列的新值與舊值
   在數據庫觸發器中幾乎總是要使用觸發器基表的列值如果某條語句需要某列修改前的值使用:OLD就可以了
From:http://tw.wingwit.com/Article/program/Oracle/201311/16551.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.