Oracle 指定別名"A" or"a"造成的問題

lnwxzyp發表於2008-12-30

今天遇到一個奇怪的問題: 本來打算給一個資料檢查的檢視做一個參數列.
SQL>create table d_data_look_over as select distinct upper(table_name) "table_name" from dw_log where start_date>trunc(sysdate-10);
SQL> table created
SQL> select table_name from d_data_look_over ;
select table_name from d_data_look_over
ORA-00904: "table_name": invalid identifier  報無效的識別符號.
在其他資料庫下進行測試 沒有發現異常
百思不得其解,難道資料庫出了問題? 但是執行下面的語句又是正常的
SQL>select * from d_data_look_over;
SQL>36 rows selected
無意之間仔細檢查建立表的語句,發現別名指定為小寫的"table_name"
SQL>select "table_name" from d_data_look_over;
SQL>36 rows selected
這樣是可以正常查詢的
將這個表刪除之後重新建了一次 並且將引號中的別名改為大寫
SQL>create table d_data_look_over as select distinct upper(table_name) "TABLE_NAME" from dw_log where start_date>trunc(sysdate-10);
SQL> table created
SQL> select table_name from d_data_look_over;
SQL>36 rows selected
可以正常查詢沒有問題.

end;

ps: 有時候字元問題確實能對初學者造成很大的困惑,昨天一個客戶在QQ上說他寫的一個儲存過程無論如何也無法編譯成功,於是我讓他把指令碼傳過來,仔細檢視之後沒有發現問題,語句也完全是正常的,但是一直提示execute immediate這一行有問題,無意之間將這一行前面的空格刪除之後 居然編譯成功了 compiled successfully.之後考慮報錯之由於前面的空格是中文全形空格造成的,刪除了這個全形空格 自然也就不再報錯了. 經過測試發現果然如此,中文輸入法下也是正常的 但是切換為全形之後輸入的空格就被認為是字元,從而無法成功編譯.

後記:發用這個方法可以實現使用Oracle的保留字作為欄位
例如:
SQL>create table zyp (LEVEL number(1),
SQL>                               COLUMN varchar2(10));
ORA-00904:無效的識別符號.
SQL>create table zyp ("LEVEL" number(1),
SQL>                               "COLUMN" varchar2(10));
Table created
但是要注意在檢視的時候 需要加上"LEVEL" 必須為大寫,否則會報錯.

                              
                            



 

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12216142/viewspace-524649/,如需轉載,請註明出處,否則將追究法律責任。

相關文章