先看個案例:以前遇到過壹個這樣的問題。壹個朋友在創建表時,表名采用小寫,並且表名用雙引號括了起來,表已經創建了,但是在查詢的時候,顯示表名不存在,可在user_tables又能看到這張表。觀察得出,加了雙引號的小寫表名存入數據庫後也是小寫。用雙引號擴起來的標識符都作為原來的大小寫格式存放在數據字典中,而Oracle在調用時,默認的使用大寫格式去數據字典中查詢。
以列名為例:
復制內容到剪貼板
代碼:
sys@EMREP> create table test(a varchar2(10), a varchar2(10));
create table test(a varchar2(10), a varchar2(10))
*
ERROR at line 1:
ORA-00957: duplicate column name
sys@EMREP> create table test("a" varchar2(10), a varchar2(10));
Table created.
sys@EMREP> SELECT table_name, column_name FROM user_tab_cols WHERE table_name = 'TEST';
TABLE_NAME COLUMN_NAME
------------------------------ ------------------------------
TEST a
TEST A
sys@EMREP> insert into test values ('1','1');
1 row created.
sys@EMREP> commit;
Commit complete.
sys@EMREP> select * from test;
a A
---------- ----------
1 1
以大寫方式存在數據字典中,驗證壹下:
sys@EMREP> create table test_xxxx(a varchar2(1), "A" varchar2(1));
create table test_xxxx(a varchar2(1), "A" varchar2(1))
*
ERROR at line 1:
ORA-00957: duplicate column name
雙引號括起來的更確切壹點叫 "引證標識符"。
比如我們創建壹張表,我們在寫CREATE語句的時候,就算表名用小寫,數據字典裏存儲的所有標識符還是大寫的,但是要想在數據字典裏存儲小寫的標識符,那寫CREATE語句的時候就得用雙引號。
所以要標識符區分大小寫,或在標識符中包含空格,或者使用保留字做標識符,就得用雙引號括起來的引證標識符。
雙引號:
① 表示其內部的字符串嚴格區分大小寫
② 用於特殊字符或關鍵字
③ 不受標識符規則限制
④ 會被當成壹個列來處理
⑤ 當出現在to_char的格式字符串中時,雙引號有特殊的作用,就是將非法的格式符包裝起來
避免出現ORA-01821: date format not recognized錯誤, to_char在處理格式字符串時,會忽略雙引號
復制內容到剪貼板
代碼:
sys@EMREP> select to_char(sysdate, 'hh24"小時"mi"分"ss"秒"') AS RESULT from dual;
RESULT
------------------
17小時31分30秒
單引號:
① 表示字符串常量
② 字符串中的雙引號僅僅被當作壹個普通字符進行處理。此時,雙引號不需要成對出現
例如:
復制內容到剪貼板
代碼:
sys@EMREP> select 'hh24"小時""mi"分"""ss"秒"' AS RESULT from dual;
RESULT
-----------------------------
hh24"小時""mi"分"""ss"秒"
③ 動態SQL:
在壹對單引號包含的語句中,必須有壹對相鄰的單引號表示壹個單引號
兩個相鄰的單引號的作用,第壹個是用來表示轉義字符,後面壹個表示真正的單引號
單引號裏要用單引號應該是兩個連續的單引號,而不是雙引號
例如:
復制內容到剪貼板
代碼:
select 'alter system kill session ''''|| sid||','||serial#|| '''';' from v$session