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

Oracle數據庫中關鍵字

2013-11-13 15:50:02  來源: Oracle 

  在Oracle數據庫 中有一些單詞具有特定的意思也許不是提供給你的但是使用它們你就可以不必解析執行和獲取你所編寫的代碼為了更准確在第一句話中的一些單詞可以歸類為保留字和關鍵字在關鍵字的分類中上下文起到了作用因為一個單詞不總是保留字例如單詞COMMIT 本身可以觸發很多事件所以你可能要假設COMMIT 是Oracle密切使用的一個關鍵字從Oracle 的角度看就是只有它可以使用這個單詞但結果是COMMIT 並沒有如它希望的那樣如果你想的話你可以創建一個叫做COMMIT 的表因為COMMIT 是一個關鍵字這比保留字的級別要低

  

  SQL> create table commit (id number);

  Table  create

  SQL>

  保留字是被鎖定的而關鍵字在某些條件下可以使用審查是一個有用的工具或功能那麼如果你想創建你自己的審查表你是否可以使用create table audit ()語句呢?

  

  SQL>  create table audit (id number);
create table audit (id number);
             *
ERROR at line :
ORA:invalid table name

  SQL>

  至少在SQL中是不行的你不能通過這種方法使用audit既然你不想使用這些特殊單詞那麼你怎樣能知道(或者你能從哪找到)特殊單詞有哪些呢?在文檔庫(在一個索引中)中的幾個指導包括了這個列表但是權威的和一站式的來源是V$RESERVED_WORDS 數據字典視圖

  視圖的名稱表示這只是關於保留字的;但是描述視圖的時候重要的主鍵列被稱為KEYWORD這使得當我要了解關鍵字和保留字的區別時把我搞糊塗了它使得視圖中的第二列也很重要RESERVED因此V$RESERVED_WORDS 的解碼環如下所示

  

  

  RESERVED值

  意思

  Y

  是保留字

  N

  不是保留字

  數據庫參考指導在對V$RESERVED_WORDS的描述中准確地表達了這個意思視圖有其它幾個字段而它們所顯示出來的(或沒有)很有意思拿LENGTH舉例這個字段如它的名字所顯示的表示了關鍵字的長度這帶來兩個問題首先為什麼這個長度重要呢?其次這個值既然很容易得到那為什麼不把它存儲為一個屬性呢?(是哪個正規化作出這個例外的?)

  在Oracle g 中個關鍵字長度是個關鍵字長度為或為空這些長度為或為空的關鍵字有哪些呢(而且它們的保留狀態是什麼)?我正在思考長度為的關鍵字因為它們通常包括符號也可以包括關鍵字>>但是這樣的話要考慮的關鍵字的數量就超出了在這裡所需要考慮的

  

  

  關鍵字(保留的)

  關鍵字(不保留的)

  |
:

[
<
]
!
*
>
(
=

@
^
/

)
+
&

  E
A
G
M
K
U
 
P
T

  在非保留關鍵字字段中有兩個值為空的例子它們顯示為一個空格或為空或其它的什麼嗎?這個問題很難回答因為它們都沒有ASCII 值如果其中一個表現為一個或多個空格的形式那麼可能backspacetab新行或者空格的值就對應地變成了

  sc_ReservedWords_image003

  讓我們更深一層地研究視圖定義並看看這些值是從哪來的使用Toad 深入到GV_$RESERVED_WORDS 腳本(在SYS schema下面VIEWS)中我們看到下面的內容

  

     SELECT inst_id keyword LENGTH
  DECODE (MOD (TRUNC (TYPE / ) )  N  Y ?) reserved
  DECODE (MOD (TRUNC (TYPE / ) )  N  Y ?) res_type
  DECODE (MOD (TRUNC (TYPE / ) )  N  Y ?) res_attr
  DECODE (MOD (TRUNC (TYPE / ) )  N  Y ?) res_semi
  DECODE (MOD (TRUNC (TYPE / ) )  N  Y ?) duplicate
  FROM x$kwddef;


    
    在格式化一些字段並按類型排序之後(只針對長度小於等於的)輸出下面的內容
    
   

   ADDR           INDX    INST_ID KEYWORD  LENGTH   TYPE

DE                                     
DDC                 E                  
DCB                 A                  
D                  G                  
DBC                  M                  
DC                  K                  
DA                  U                  
DEC                                     
DA                  P                  
DCC                  T                  
DE                  |                  
DFF                  :                  
DA                                    
DAA                  [                  
DADE                  <                  
DBB                  ]                  
DBEC                  !                  
DCC                 *                  
DBAC                  >                  
DD                  (                  
D                  =                  
DCBC                                    
D                  @                  
DFDC                  ^                  
DB                  /                  
DA                                    
DBC                   )                  
DF                   +                  
D                   &                  

  TYPE 字段用作分組全部的類型數量如下所示

  

   SQL> select type count(*)
    from x$kwddef
    group by type
    order by ;
      TYPE   COUNT(*)

                
                 
                  
                
                
                 


    
    將類型的值作為一個指示器將一個單詞指定為具有重復的意思使它具有一個足夠高的類型值(大於)以便分割的截斷大於個具有重復值的單詞是

  

   關鍵字

PRIVILEGE
NOPARALLEL_INDEX
NESTED_TABLE_SET_REFS
INTEGER
NOREWRITE
REFERENCING
NO_FILTERING
SB
UB
INDEX_RS
SMALLINT
NOCPU_COSTING
PARALLEL
ROLES
MAXARCHLOGS
CONSTRAINTS
DECIMAL
CHAR

  這些單詞真的與其它關鍵字具有同一個意思嗎?通過計算答案是否定的直接的單詞數()和總的單詞數()間只有兩個數的差距這是否是和單詞的目的或功能有某種關聯呢?就是說是否CHAR是(大致是)和VARCHAR一個意思呢?如果是這樣的話那麼VARCHAR(或VARCHAR選一個)也應該是相同的那麼這個相同的意思就有點神秘了

  讓我們來看一個從Oracle 公司的展望而來的問題在OTN論壇上的一個技術作者在創建新的關鍵字一欄裡發表了一篇文章叫做認識到的一個關鍵問題許多的(如果不是所有的)有記錄的優化器hint是某種形式的關鍵字假設你創建一個叫做GO_FAST 的存儲過程但是在下一個版本的關系數據庫管理系統中就有一個新的(假設我們願意等這麼久!)叫做GO_FAST 的hint 供你使用你就可以開始想象當已創建的對象名稱為了不和新版本中的保留字沖突而要改名時接收到的客戶的海量抱怨

  但是已記錄的單詞數從版本中的增加到了中的減少兩個視圖的結果就是g 有個關鍵字在i 中找不到i 有兩個(不算空白的話)在g 中找不到許多新的單詞是和優化器hint有關的

  作為一個開發人員你需要能夠開發一個用戶無權使用的scheme可以在你的關系數據庫管理系統產品的開始建立一個scheme這個scheme不只要阻止與它不一致的用戶還要只允許一些選定的用戶能夠首先看到它X$表就是用於這個的

  我試著解釋在X$表名稱背後所隱藏的意思幾個來源定義了許多X$表;一個相當廣泛的來源是MetaLink 的注解即使有了這個列表kwddef的意思也還沒有表示出來我們知道開頭k是核心的意思我曾經猜測wddef可能是與單詞定義有關

  關鍵是在SYS中所命名的避免了沖突但是在SYS中所顯示出來的(通過視圖作為一種方式)可能會與你的代碼或命名scheme 沖突你肯定已經做過這樣的事情在Oracle 中在某些等級上一個對象有且只有一個名稱用戶A和用戶B可以各有一個叫做EMP的表但是最多只能有一個具有和EMP相同名稱的公共同義字假設一個用戶叫做A:

  

   SQL> create table aemp as select * from scottemp;
Table created
SQL> create public synonym emp for scottemp;
Synonym created
SQL> create public synonym emp for aemp;
create public synonym emp for aemp
                      *
ERROR at line :
ORA: name is already used by an existing object

  結束語

  建立一個命名規范特別是對於關鍵字這使我想起了在騎士保護聖杯時看到的(在聖戰奇兵中的情景)當Donovan (Jones的敵人)選了錯誤的酒杯後可怕的死狀他選了可憐的一旦選好了關鍵字並且產品發布給了用戶那麼再要添加更多的關鍵字(或要將一個非保留字改變為一個保留字)就很困難了在早期所做的表面上看起來沒什麼關系的選擇或決定可能限制你將來的選擇盡管允許某些單詞可以重新定義看起來好像你具有了很大的靈活性但是你可能只是使這條路越來越混亂

  而使得情況更加復雜的是Oracle 的一些關鍵字同時還是ANSI保留字此外如果使用不同的系統那麼在系統A中的關鍵字可能在系統B中不是關鍵字在電影的後面部分在Indiana 選中了正確的酒杯之後騎士說道你選對了當給出了許多單詞來選擇時這可能很難做到現在選擇你所需要的並且如果可能的話設置一些保留狀態的保留字以防萬一在將來將它們刪除要比試著要求它們要來得容易


From:http://tw.wingwit.com/Article/program/Oracle/201311/17370.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.