ORACLE 动态SQL中的多个单引号
今天在項(xiàng)目中遇到動(dòng)態(tài)拼sql的語(yǔ)句,
語(yǔ)句如下:
v_sql := 'update Table_Test t '
?? ? ? ?||' set t.field1 = ''' || 變量1 || ''',' ?-- v_BalRuleID || v_BalanceSeq || ''','
?? ? ? ?||' t.field2 = ''' || 變量2 || ''','
?? ? ? ?||' t.field3 = ''' || 變量3 || ''','
?? ? ? ?||' t.field4 = 1,'
?? ? ? ?||' t.field5 = ' || 變量4 ? ? ? ? ? ?
?? ? ? ?||' where t.field6 = ''' || 變量5 || ''''
?? ? ? ?||' ?and ?INSTRb( '''|| 變量6 ||''',t.field7 ) >0 ';
?? ?execute immediate v_sql;
于是對(duì)其中多個(gè)連續(xù)的單引號(hào)感到奇怪,google后,終于恍然大悟,下面把總結(jié)貼出來(lái):
?在ORACLE中,單引號(hào)有兩個(gè)作用,一是字符串是由單引號(hào)引用,二是轉(zhuǎn)義。單引號(hào)的使用是就近配對(duì),即就近原則。而在單引號(hào)充當(dāng)轉(zhuǎn)義角色時(shí)相對(duì)不好理解。
? 1、從第二個(gè)單引號(hào)開始被視為轉(zhuǎn)義符,如果第二個(gè)單引號(hào)后面還有單引號(hào)(哪怕只有一個(gè))。
SQL> SELECT '''' FROM DUAL;
?
''
--
'
?
為了證實(shí)結(jié)果是被第二個(gè)單引號(hào)轉(zhuǎn)義的第三個(gè)單引號(hào)(既:SELECT '''' FROM DUAL;),我們做如下兩個(gè)測(cè)試:
?
SQL> SELECT ''' FROM DUAL;
ERROR:
ORA-01756: 括號(hào)內(nèi)的字符串沒有正確結(jié)束
?
?
相信大家對(duì)這樣的錯(cuò)誤不陌生吧
?
SQL> SELECT 'SDLF FROM DUAL;
ERROR:
ORA-01756: 括號(hào)內(nèi)的字符串沒有正確結(jié)束
?
?? 也就是說(shuō),當(dāng)?shù)诙€(gè)單引號(hào)充當(dāng)轉(zhuǎn)義角色,第三個(gè)單引號(hào)被轉(zhuǎn)義,(既:select '' ' from dual;)自然就缺少與第一個(gè)單引號(hào)匹配的單引號(hào)了,出現(xiàn)了孤立的單引號(hào)
下面的兩個(gè)實(shí)驗(yàn)就更加支持了上面的結(jié)論。
?
SQL> SELECT ' '' ' FROM DUAL;
?
''''
------
'
?
SQL> SELECT '' '' FROM DUAL;
SELECT '' '' FROM DUAL
????????? *
ERROR 位于第 1 行:
ORA-00923: 未找到預(yù)期 FROM 關(guān)鍵字
?
?
?
對(duì)于第一個(gè):SELECT ' '' ' FROM DUAL;
對(duì)于第二個(gè):不存在轉(zhuǎn)義。
?
上面的這兩個(gè)實(shí)驗(yàn)其實(shí)也是單引號(hào)轉(zhuǎn)義與非轉(zhuǎn)義的一個(gè)性質(zhì):轉(zhuǎn)義是密集的,也就是說(shuō),如果單引號(hào)出現(xiàn)在轉(zhuǎn)義的位置上,而該單引號(hào)后面緊跟(緊跟的定義為:兩個(gè)單引號(hào)之間是零距離的)的不是單引號(hào),這個(gè)時(shí)候單引號(hào)就不在充當(dāng)轉(zhuǎn)義的角色,而是與它前面的配對(duì)。
?
2、連接符‘||’導(dǎo)致了新一輪的轉(zhuǎn)義:連接符號(hào)‘||’左右的單引號(hào)沒有任何的關(guān)系,除非‘||’是作為字符串的一部分(這在動(dòng)態(tài)SQL中很常見)。
?
SQL> SELECT 'ORACLE'||'''' FROM DUAL;
?
'ORACLE'||''
----------
ORACLE'
?個(gè)人理解,'ORACLE'||'''' 后面的“''''”應(yīng)該認(rèn)為是一個(gè)字符串(即前后單引號(hào),中間是“''”串,而中間又是密集單引號(hào),因此第一個(gè)為轉(zhuǎn)義功能)
SQL> SELECT 'ORACLE''''' FROM DUAL;
?
'ORACLE'''''
------------
ORACLE''
對(duì)于第一個(gè),前兩個(gè)單引號(hào)配對(duì),后面四個(gè)單引號(hào)按照上面的第一條原則分配,既:SELECT 'ORACLE'||'''' FROM DUAL;
對(duì)于第二個(gè),由于第二個(gè)單引號(hào)后面存在單引號(hào),所以就不與第一個(gè)配對(duì),而是充當(dāng)了轉(zhuǎn)義的角色。既:SELECT 'ORACLE''''' FROM DUAL;
總結(jié)
以上是生活随笔為你收集整理的ORACLE 动态SQL中的多个单引号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle ADDM 自动诊断监视工具
- 下一篇: 怎样通过DOS来提取一个文件夹下所有文件