充分利用OracleSQLDeveloper報表

  oracle sql developer(以前稱為 project raptor)是 oracle 針對開發人員和 dba 新推出的多平台圖形用戶界面 (gui)。與 oracle 資料庫 10g 快捷版 (xe) 以及 oracle jdeveloper 一樣,可以免費下載 oracle sql developer。oracle sql developer 可在 windows、macintosh 和 linux 平台上運行。

oracle sql developer 為開發人員提供了許多強大特性,包括用於運算元據庫對象的圖形對話框、sql 工作表、pl/sql 編輯器以及一個報表工具。它基於 oracle jdeveloper java ide,具有直觀的樹狀導航結構。

  報表工具允許以兩種方式創建報表:可以從一大組預定義的標準數據字典報表中進行選擇,也可以創建一個用戶自定義的報表。oracle sql developer 報表還支持綁定變數和下鑽報表。

  安裝、配置以及創建到資料庫的連線超出了本文的討論範圍。有關這些主題的詳細信息,請參閱 otn 上的 oracle sql developer 主頁。

  要使用報表,首先啟動適合您平台的 oracle sql developer。連線到一個資料庫,單擊 reports 選項卡。單擊 reports 符號旁邊的加號 (+),然後單擊 data dictionary reports 旁邊的加號。暫時先不管 user defined reports 項。

  樹狀視圖導航在此表現為資料夾和檔案。例如,data dictionary reports 目錄是 reports 資料夾的子目錄,或者用導航語法表示為 reports->data dictionary reports。

單擊 data dictionary 資料夾中任意子資料夾旁邊的加號。

oracle 提供的報表

(註:運行某個報表時,可能會看到 select connection 對話框。選擇您的連線,然後單擊 ok。 )

data dictionary reports 資料夾列出了 oracle 提供的預定義報表集合。我們首先來看看這些標準報表中的一些報表。下面列出的是我發現在工作中很有用的一些報表。瀏覽這些報表,看看哪些報表可能對您有用。

all parameters 報表 (reports->data dictionary reports->database administration->database parameters->all parameters) 列出了所有的資料庫初始化參數。

當您單擊某個報表時,該報表自動運行。一些報表具有 enter bind values 對話框,該對話框允許您限制對某些參數的查詢。我將在下面詳細討論綁定變數。要運行該報表,選擇 apply。

選擇 free space 報表 (reports->data dictionary reports->database administration->storage->free space) 可查看每個表空間中的可用空間。

active sessions 報表 (reports->data dictionary reports->database administration->sessions->active sessions) 顯示了資料庫中的所有活動會話。使用該報表可查看登錄的用戶及其會話的詳細信息。

我發現 top sql 節點下的所有報表 (reports->data dictionary reports->database administration->top sql->*) 都很有價值。我喜歡對系統中進行的操作有一個整體了解,按 cpu 或 io 查看 top sql 就是實現此目的的一個不錯方法。

當我記不住確切的表名或列名時,user tables 報表 (reports->data dictionary reports->table->user tables) 就是個不錯的幫手。

我發現 quality assurance 報表 (reports->data dictionary reports->table->quality assurance->*) 在開發過程中很有價值。我傾向於手工編寫大量的 ddl 代碼,很可能會丟失某個索引或鍵。

使用 pl/sql 搜尋報表 (reports->data dictionary reports->pl/sql->search source code) 可以節省大量時間。可以根據對象名稱或源文本字元串進行搜尋。

  我們來看看該報表背後的 sql 代碼。在需要的時候運行該報表。在 reports 窗格上,報表數據上方有三個按鈕:一個紅色的圖釘、一個綠色的三角形,以及矩形中的文本 sql。最後一個按鈕從報表中複製 sql,將其放在一個 sql 工作表中。單擊 sql 按鈕。

查看所提供的 sql 是一個學習一些 sql 技巧的好方法。其中有些技巧將幫助您創建自己的用戶定義報表。

下鑽報表

oracle sql developer 報表的一個重要特性是下鑽功能。這是我最喜歡的 oracle sql developer 特性之一。我稍後將在本文中將向您介紹如編寫自己的下鑽報表。

打開 reports->data dictionary reports->table->user tables 報表,它列出您模式中的所有表。運行了該報表後,雙擊結果集格線中的任一行。

該操作將打開一個包含表的說明的新選項卡。如果您遵循了以上操作,現在就會看到該表的列定義。在數據窗格中,您將有兩個選項卡:一個針對所運行的報表,另一個針對下鑽對象。打開另一個報表,雙擊某一行。

下鑽適用於在導航器上(在 connections 選項卡下)具有對應節點的所有報表。如果您嘗試雙擊 all parameters 報表,則不會發生任何操作,這是因為 connections 下面沒有 parameter 節點。

由於下鑽功能僅限於 navigator 節點上的項,因此從某種程度上講,它僅限於您自己的報表。當使用 oracle sql developer 的 oracle 開發人員增加了下鑽到某處的能力(即替換下鑽查詢)時,這將是一個真正有用的功能。

直到此時,它才對您碰巧編寫的任何字典報表有用。如果您希望向正在編寫的報表添加下鑽功能,只需在查詢中添加三個列即可。下面,我給出了一些示例。

在該圖中,sdev_link_owner 是 object_owner,sdev_link_name 是 object_name,sdev_link_type 是 object_type。

用相同的別名添加這三項,雙擊時,oracle sql developer 將自動下鑽。記住,只有那些在導航器窗格中具有節點的項才能在此時下鑽。

簡單的用戶報表

註:針對下面的大多數示例,我在 oracle 資料庫 xe 安裝中使用 system 帳戶和 hr 帳戶。如果您有一個 oracle 資料庫 xe 資料庫,按我說的做會更簡單些。如果您沒有 oracle 資料庫 xe 資料庫,仍然可以按我說的做,但是在某些情況下可能必須選擇不同的表。可以從 otn 上免費下載 oracle 資料庫 xe。

現在,您將首先創建一個簡單的報表。以 hr@xe 身份登錄。單擊導航器中的最後一個節點 user defined reports。右鍵單擊這個展開的節點,您將看到一個具有以下選項的上下文選單:add folder、add report、delete、copy、cut 和 paste。

oracle sql developer 為導航維護一個樹結構;我建議您最好進行相同的操作。使用資料夾對報表按邏輯分組。您可以選擇按應用程式對報表進行分組,我對下面圖 12 中顯示的 employee reports 和 user data dictionary 應用程式下面的報表就是這樣處理的。除了按應用程式名稱進行分組外,您可能還希望按其他標準對報表進行分組,但不建議您轉儲 user defined reports 下的所有內容。

選擇 add folder 新建一個資料夾。現在,我們將該資料夾稱作 employee reports。輸入您希望用作說明的任何內容。如果您將滑鼠停留在導航器中的該項上,將顯示 tooltip 文本。單擊 apply 保存。

在 employee reports 上單擊滑鼠右鍵。現在的上下文選單與前一個相比多了一個 edit 項。選擇 edit。進行所需要的任何更改,然後單擊 apply 保存。

再次單擊滑鼠右鍵,然後選擇 add report。將報表命名為“number of employees by department”。在 description 和 tooltip 中輸入您想要的任意文本。將下面的查詢用作報表 sql:

select department_id, count(*)from employeesgroup by department_id

單擊 apply 保存。

單擊 employee reports 節點旁邊的加號,然後單擊新報表。可能會看到 select connection 對話框。如果這樣,則選擇 hr 連線並單擊 ok。

現在,您是您第一個用戶定義報表的自豪的所有者。儘管該報表很有用,但如果它能列出部門名稱而非部門 id,用處就更大了。要添加該功能,首先在該報表上單擊滑鼠右鍵。您將注意到該報表在上下文選單中具有以下幾項:open、open new window、edit 和 show properties。選擇 edit。

更改您的查詢,使其包括 departments 中的部門名稱:

select d.department_name, count(*)from employees ejoin departments d on (e.department_id = d.department_id)group by d.department_name

單擊 apply 保存,然後返回報表。

讓我們將這個報表變得更加有趣。在該報表上單擊滑鼠右鍵,選擇 copy。如果再次單擊滑鼠右鍵,將發現沒有了 paste 選項。右鍵單擊 employee reports 節點。現在可以貼上報表了。右鍵單擊新報表(結尾處有括弧包含著數字的報表),選擇 edit。將查詢更改為下面的測試:

select e.last_name, e.first_name, d.department_name, count(*) over (partition by d.department_name) dept_count, count(*) over ()from employees ejoin departments d on (e.department_id = d.department_id)

運行報表。現在,這很有用。報表中包含一名雇員、一個部門名稱、該部門中的雇員數量,以及所有部門中的雇員數量。

創建有用的報表的關鍵在於能夠創建動態報表。如果您使用綁定變數,報表將能針對每次運行動態改變。在 oracle sql developer 1.0 之前的版本中,雖然您可以修改 userreports.xml 檔案(位於 sql developer user information directory 中)來變相地添加綁定變數,並它並不直接支持使用綁定變數的用戶定義報表。使用 1.0 版可以輕鬆地創建使用綁定變數的報表。

現在對報表進行最後更改。您要添加一個綁定變數,它將允許用戶輸入一個部門名稱或部分名稱來選擇具體的部門,它也可以為空以選擇所有部門。按如下所示修改 sql:

select e.last_name, e.first_name, d.department_name, count(*) over (partition by d.department_name) dept_count, count(*) over ()from employees ejoin departments d on (e.department_id = d.department_id)where (:dept_name is nullor d.department_name = :dept_name)

運行該報表,然後看您的綁定變數螢幕。試著輸入一些值。

現在,我們來套用報表製作技巧,創建一個將對所有開發人員和 dba 有用的報表。

複雜報表

由於這是一個新的報表類別,因此我們在 user defined reports 節點下面新建一個資料夾。該資料夾將包含您自己的 data dictionary 報表集,因此我們就將其稱為 user data dictionary 吧。

您的新報表將列出資源回收筒中的所有對象以及它們所占用的空間。該報表在 oracle 資料庫 xe 中尤為方便,您可以針對您的對象將磁碟空間限制為 4gb。

運行該報表的用戶需要能夠訪問 sys.dba_objects、sys.dba_segments 和 sys.dba_recyclebin 資料庫對象。我通常以 sysdba 用戶的身份運行該報表。

新建一個用戶定義的報表,將其命名為 recycled objects。在 description 和 tooltip 中輸入想要的任意文本。使用該查詢:

select ao.owner,ao.object_type,ar.original_name,ao.object_name recycled_name,ar.droptime,ds.bytes/1024/1024 "megabytes",ao.owner sdev_link_owner,ao.object_name sdev_link_name,ao.object_type sdev_link_typefrom sys.dba_objects ao,sys.dba_segments ds,sys.dba_recyclebin arwhere ao.object_name like 'bin$%'and ao.owner = ds.ownerand ao.object_name = ds.segment_nameand ar.object_name = ao.object_nameand ((ao.subobject_name is null and ds.partition_name is null)or ao.subobject_name = ds.partition_name)and ((:original_name is null or ar.original_name = :original_name)and (:object_type is null orao.object_type = :object_type))

該報表包括 sdev_link_owner、sdev_link_name 和 sdev_link_type 別名。這意味著允許您下鑽來查看所引用的項的結構。對於該查詢而言,它將下鑽到 recyclebin 中的項。如果將 sdev_link_name 從 ao.object_name 更改為 ar.original_name,您將下鑽到已經替換了它的項(如果有的話)。可以對該報表進行修改,以便允許在模式之間切換。

將 sdev_link_name 行從

ao.object_name sdev_link_name,

修改為

decode( :original_or_recycle, 1, ar.original_name, ao.object_name) sdev_link_name,現在,運行該報表時,如果希望下鑽到回收的對象,不用進行任何操作即可。另一方面,如果希望下鑽到初始對象(如果存在),則將 original_or_recycle 變數更改為 1。

  這些技巧使 oracle sql developer 中的下鑽功能變得如此聰明。當 oracle 開發人員將該功能修改為允許通過自定義的查詢下鑽時,這將非常有用!訪問 otn 上的 oracle sql developer 論壇 ,讓 oracle 知道您需要自定義查詢下鑽這個特性!

  除了更改 original_or_recycle 變數外,還可以用對象類型和/或初始對象名稱來限制返回數據集。該查詢的最後四行創建了綁定變數。上面詳細介紹了綁定變數,因此無需贅述。

在綁定變數對話框中為報表的終端用戶提供額外的描述性信息將很有幫助,難道不是嗎?如果我想與其他人共享該報表,original_or_recycle 變數確實需要額外的描述性文本。有一種提供該操作的方法。

  我已經提到過,在 oracle sql developer 1.0 之前的版本中,編輯 userreports.xml 檔案可以添加綁定變數。您可以在當前版本中執行相同操作來擴展綁定功能。可以添加描述性文本,更改提示,甚至可以指定默認值。下面介紹如何添加描述性文本:

  您需要導航到名為 sql developer user information directory 的 os 目錄。在 ms windows 中,打開 c:->documents and settings 目錄。在該目錄下,選擇要用來登錄的用戶身份。例如,如果以 lcunning 身份登錄,我就會導航到 c:->documents and settings->lcunning 目錄。在該目錄中,導航到 .sqldeveloper 目錄。與我的用戶 lcunning 保持一致,我現在在 c:->documents and settings->lcunning->.sqldeveloper 目錄中。

在 linux 中,您會發現該目錄是 .sqldeveloper 主目錄下的一個子目錄。因此,對於 $home 為 /home/lcunning 的用戶而言,userreports.xml 應該位於 /home/lcunning/.sqldeveloper 下。

.sqldeveloper 目錄中至少應該有兩個檔案。其中一個檔案就是 userreports.xml,它包含您的用戶定義報表。您可以用最喜歡的 xml 編輯器打開它。

註:編輯 userreports.xml 檔案之前,請進行備份!如果您搞亂了 xml 語法,您還能用備份替換該檔案,然後重新開始。

xml 文檔的格式如下所示:

<reports><folder><name></name><description></description><report enabled="true"><name></name><description></description><tooltip></tooltip><query><sql></sql></query></report></folder></reports>

您可以從內向外理解這個檔案,這是因為 sql 查詢包裝在一個報表中,該報表位於一個包含在報表文檔中的資料夾中;您還可以從外向內理解這個檔案,這是因為報表文檔包含一個或多個資料夾(具有一個名稱和一個描述),而每個資料夾又包含了一個或多個報表。每個報表都用名稱、描述、工具提示和查詢定義。一個查詢由多條 sql 語句組成。

query 節點就是進行修改的地方。您將在 <query> 節點中緊跟 <sql> 節點後添加一個 <binds> 節點。

binds 節點應如下所示:

<binds><bind id=""><type></type><prompt></prompt><value></value><tooltip></tooltip></bind></binds>

bind 標記的 id 屬性是綁定變數的名稱。以這種方式創建綁定變數時,如果您包括了一個綁定變數,就必須包括該報表的所有綁定變數。

如果希望某個綁定變數有一個默認值,可以將該值放在 value 元素中。

進一步的描述放在 tooltip 中。對於><type><![cdata[null</type><prompt><![cdata[original_or_recycle</prompt><value><![cdata[null_value</value><tooltip><![cdata[enter 1 to drill down to the><type><![cdata[null</type><prompt><![cdata[original_name</prompt><value><![cdata[null_value</value><tooltip><![cdata[enter the><type><![cdata[null</type><prompt><![cdata[object_type</prompt><value><![cdata[null_value</value><tooltip><![cdata[enter an object type</tooltip></bind></binds>

使用 ![cdata ]] 文本是一種保護自己的方法,因為它告訴 xml 分析器不要嘗試解釋方括弧中的內容。如果您不熟悉 xml,應該努力總是包括該文本。

修改描述性文本和默認值有很大的價值,因此我打賭 oracle 的 sql developer 團隊過一段時間將對此進行改進。現在已經有了定製的能力;只不過還沒有接口。

修改了 userreports.xml 檔案之後,您將需要退出並重新啟動 oracle sql developer。重新啟動之後,運行報表。您會看到類似下面的螢幕。

共享報表

如果您想與客戶、同事或其他 oracle sql developer 用戶共享自己的用戶定義報表,可以複製 userreports.xml 檔案,然後將它移至他們計算機上的 sql developer user information directory,即可共享您的所有報表。

如果您不想共享其中某些報表,則針對特定報表刪除 <report> 和 </report> 之間的文本。(請再次確保保留了檔案的備份!)

導出報表數據

運行了報表後,在數據格線中單擊滑鼠右鍵,將看到一個上下文選單。唯一的選項應該是 export。選擇 export,將獲得另一個包含了 csv、xml、insert、loader 和 text 的選單。這些選項是報表數據的導出格式。選擇以上任何選項都會彈出相同的對話框。

csv 是一個用逗號分隔的值檔案,適用於導入到電子表格(或 oracle application express)中。 xml 是數據的 xml 文檔。 insert 為數據集中的每條記錄創建一個插入語句。 loader 創建一個 sql*loader 數據控制檔案。 text 創建一個用制表符分隔的文本檔案。

對話框中的 columns 選項卡允許您選擇導出檔案中包含哪些列,where 選項卡允許您添加一個可選的 where 子句以限制進入輸出檔案的記錄。

sql*plus 該讓位了

oracle sql developer 是每個 oracle 開發人員的工具包中都應有的一個工具。oracle sql developer 除了允許您進行 sql 和 pl/sql 開發外,還提供了一個長長的有用報表的列表,以及一個創建您自己的用戶定義報表的工具。

sql*plus 該讓位了,oracle sql developer 簡化了自定義報表的創建,並且提供了額外的功能(如變數對話框和下鑽報表)。如果您定期訪問某個 oracle 資料庫,您可以將其歸自己所有,下載 oracle sql developer 試一下。

lewis r. cunningham 是交通運輸行業的一名資料庫架構師、開發人員和 dba,並且是一名 oracle ace。他在 為 ittoolbox 編寫 “an expert’s guide to oracle”,並且使用 oracle 技術有 13 年了。