国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle10g SQL*PLUS 的一些特性

2024-08-29 13:37:49
字體:
來源:轉載
供稿:網友

  SQL*Plus 的成長 
  隨著 Oracle Database 10g的發布,這個小而強大的 DBA 工具有了一些引人注目的變化,包括有用的提示符和高級文件處理 
   
  數據庫治理員天天用得最多的工具是哪一個?對于許多象我一樣在 GUI 革命之前的數據庫治理員而言,一定是 SQL*Plus 命令行選件。 
   
  雖然隨著強大和功能豐富的 EnterPRise Manager 10g 的引入,SQL*Plus 在 Oracle Database 10g 中已經發生了一些變化,但這個普遍存在的小工具仍將繼續作為 Oracle 原有系統的一部分 — 對初學者和經驗豐富的數據庫治理員同樣適用。 
   
  在本部分中,我們將研究對 SQL*Plus 10.1.0.2 所作的一些非常有用的改進。切記,要繼續下面的操作,您將需要 Oracle Database 10g 軟件的 sqlplus 可執行程序,而不是運行在 10g 數據庫上的 Oracle9i Database sqlpuls。 
   
  為粗心用戶提供的提示符 
  我在哪里,或我是誰?不,這不是對您精神的拷問;這是關于用戶在 SQL*Plus 環境的上下文中位于何處的問題。SQL*Plus 中的默認提示符 — 簡單的 SQL> — 不指出用戶是誰,以及用戶作為什么連接。在早期的版本中,您必須進行一些麻煩的編碼來獲取變量,但現在不再需要這樣了。在 SQL*Plus 10.1.0.2 中,您可以使用: 
   
  set sqlprompt "_user _privilege> "
   
  SQL*Plus 提示符顯示為 
   
  SYS AS SYSDBA>
   
  當然,假定用戶 SYS 是作為 SYSDBA 登錄的。注重兩個預先定義的非凡變量 — _user 和 _privilege — 的使用,它們定義了當前的用戶和登錄的權限。 
   
  讓我們再增加一些其它的功能:現在還想顯示今天的日期。我們需要做的就是用下面這些命令來使提示符顯示想得到的信息。 
   
  SQL> set sqlprompt "_user _privilege 'on' _date >"
  SYS AS SYSDBA on 06-JAN-04 >
   
  再增加數據庫連接標識符怎么樣?您想知道您在“什么樣”(在生產或開發中)的情況下,這種方法的確非常有幫助。 
   
  SQL> set sqlprompt "_user 'on' _date 'at' _connect_identifier >"
  ANANDA on 06-JAN-04 at SMILEY >
   
  到目前為止還不錯;但我們可能想要以一種更具體的方式來顯示當前的日期(帶小時和分鐘),以更加有用。 
   
  ANANDA on 06-JAN-04 at SMILEY > alter session set nls_date_format = 'mm/dd/yyyy hh24:mi:ss';
   
  Session altered.
   
  ANANDA on 01/06/2004 13:03:51 at SMILEY >
   
  問題解決了:輸入幾行命令就得到了能夠提供豐富信息的 SQL 提示符。將它保存在 glogin.sql 文件中,您就始終擁有這些特性。 
   
  必須使用引號嗎?為什么,不! 
   
  在 Oracle9i 中取消了對內部登錄的支持之后,全世界許多 DBA 表示反對:他們應當如何在命令行上輸入 SYS 的口令并保持安全性?嗯,答案是在操作系統提示符中使用引號: 
   
  sqlplus "/ as sysdba"
   
  引號的使用令人遺憾,但還是被大家所接受(雖然有些怨言)。在 Oracle Database 10g 中不需要這樣了。現在您可以在 OS 命令提示符下,輸入以下命令,不需要引號 
   
  sqlplus / as sysdba
   
  作為 SYSDBA 登錄。這種改進不僅意味著您少輸了兩個字符,還有一些額外的好處,例如在 Unix 之類的操作系統中不需要 escape 字符。 
   
  改進的文件處理
  假設您在處理一個問題,并使用了一些自由格式的即席 SQL 語句。很明顯,它們很有用,您想把它們保存起來,以便將來使用。您會怎么做?您就可以把它們保存在各個文件中,如下所示: 
   
  select something1 ....
  save 1 
  select something else ....
  save 2
  select yet another thing ....
  save 3 
   
  等等。一段時間以后,您需要收集所有保存的文件,以便將來使用。
多麻煩!SQL*Plus 10.1.0.2 答應您將語句添加到文件中,進行保存。在前一個例子中,您可以使用: 
   
  select something1 ....
  save myscripts
  select something else ....
  save myscripts append
  select yet another thing ....
  save myscripts append
   
  等等。所有的語句將添加到文件 myscripts.sql 中,從而不再需要保存在單獨的文件中,然后把它們連接成單個文件。 
   
  這種方法還適用于假脫機。在以前的版本中,命令 SPOOL RESULT.LST 將創建文件 result.lst (假如該文件不存在);但假如該文件已存在,則將覆蓋它,而沒有提示。這種行為經常(非凡在復雜環境下)可能導致不希望的邊緣效應,例如重要的輸出文件被覆蓋。在 10g 中,spool 命令可以使文件內容附加在一個現有的文件后面: 
   
  spool result.lst append
   
  假如您想覆蓋它,那么該怎么做?簡單地省略 append 子句,或使用默認值 REPLACE。以下命令將在寫操作之前檢查文件是否存在。 
   
  spool result.lst create
  Use another name or "SPOOL filename[.ext] REPLACE"
   
  這種方法防止覆蓋文件 result.lst。 
   
  Login.sql 是用于登錄的,是嗎? 
   
  記得文件 login.sql 和 glogin.sql 嗎?本來在任何時候當調用 SQL*Plus 時,都將運行當前目錄中的 login.sql 文件。但是,有一個嚴重的局限。在 Oracle9i 和更低版本中,假定在文件中有下面這一行。 
   
  set sqlprompt "_connect_identifier >"
   
  當您首先啟動 SQL*Plus 與數據庫 DB1 連接時,提示符顯示: 
   
  DB1>
   
  現在,假如您從提示符中與另一個數據庫 DB2 連接: 
   
  DB1> connect scott/tiger@db2
  Connected
  DB1>
   
  注重提示符。雖然您現在和 DB2 連接在一起,但提示符仍是 DB1,。很明顯,提示符是不正確的。原因很簡單:在連接時沒有執行 login.sql 文件,只在 SQL*Plus 啟動時執行了該文件。后來的連接沒有重新執行該文件,使得提示符沒有改變。 
   
  在 Oracle Database 10g 中,消除了該局限。文件 login.sql 不僅在 SQL*Plus 啟動時執行,而且在連接時也執行。因此在 10g 中,假如您當前與數據庫 DB1 連接,后來改變了連接,則提示符將改變。 
   
  SCOTT at DB1> connect scott/tiger@db2
  SCOTT at DB2> connect john/meow@db3
  JOHN at DB3>
   
  不希望改變! 
   
  假如由于某些原因,您不想使用這些增強的 SQL*Plus,那該怎么辦?很簡單,用 -c 選項來調用它: 
   
  sqlplus -c 9.2
   
  SQL*Plus 環境將和舊的 9.2 版一樣運轉。 
   
  自由地使用 DUAL 
  您認為有多少開發人員(還有 DBA)經常使用這條命令? 
   
  select USER into from DUAL
   
  可能非常多。對 DUAL 的每次調用創建邏輯 I/O — 數據庫沒有邏輯 I/O 也可以工作。在某些情況下必須調用 DUAL,如在行 := USER 中。因為 Oracle 代碼將 DUAL 當作一個專用的表,所以調整表的某些想法可能不適用或不貼切。 
   
  Oracle Database 10g 使得所有這些擔心完全消失了:因為 DUAL 是一個專用的表,所以持續獲得顯著地減少了,并且與從事件 10046 跟蹤中看到的優化計劃不同。 
   
  在 Oracle9i 中 
  Rows   Execution Plan
  ------- ---------------------------------------------------
  0 SELECT STATEMENT  GOAL:CHOOSE
  1  TABLE access (FULL) OF 'DUAL'
     
   
  在 10g 中 
  Rows   Execution Plan
  ------- ---------------------------------------------------
  0 SELECT STATEMENT  MODE:ALL_ROWS
  0  FAST DUAL
   
  注重新的 FAST DUAL 優化計劃的使用,與 Oracle9i 中的 DUAL 的 FULL TABLE SCAN 相反。這一改進顯著地減少了持續讀取,從而為頻繁使用 DUAL 表的應用程序帶來好處。 
   
  注重:從技術角度看,這些 DUAL 改進是在 SQL 優化器中實施的,但是,對許多用戶而言,SQL*Plus 是用于處理 SQL 的主要工具。 
   
  其它有用的信息 
  其它的 SQL*Plus 增強在本系列的其它地方進行了說明。例如,我在第 5 周關于閃回表的內容中說明了 RECYCLEBIN 的概念。 
   
  與一些流傳甚廣的傳言相反,COPY 命令仍然可用,雖然將在以后的版本中廢除。
假如您有使用這條命令編寫的腳本,別沮喪,它不僅可用而且仍被支持。實際上,只錯誤消息報告方面作了一點改進。假如表有一個 LONG 列,則 COPY 是您創建表的備份的唯一方式,常見的 Create Table As Select 將不能處理帶 long 數據類型的列的表。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿荣旗| 靖西县| 昌平区| 塔城市| 潢川县| 莲花县| 新余市| 京山县| 山东省| 视频| 甘德县| 汽车| 巴彦淖尔市| 浦江县| 汕尾市| 渝中区| 南岸区| 丁青县| 冀州市| 肃北| 武鸣县| 井陉县| 洱源县| 滨海县| 同江市| 突泉县| 绍兴县| 扶绥县| 新晃| 巍山| 永靖县| 花莲市| 连南| 炎陵县| 罗源县| 尖扎县| 互助| 社会| 西盟| 卓尼县| 安顺市|