oracle中單引號的雙重作用:表示字符串+轉義符


作用1:表示字符串

作用2:表示轉義符

declare
v_sql varchar2(100);
v_empname t_employ.empname%type:='&empname';
v_id t_employ.id%type:=&empid;
v_depid t_employ.depid%type:=&depid;
begin
v_sql:='select empname from t_employ where 1=1';
if v_id>0 then
v_sql:=v_sql||' and id='||v_id;
end if;
if v_depid>0 then
v_sql:=v_sql||' and depid='||v_depid;
end if;
if v_empname is not null then
v_sql :=v_sql || ' and empname like ''%' || v_empname || '''';
--’ and empname like ''' 中間兩個轉義為一個' '''' 中間兩個轉義為一個'
--單引號轉義與非轉義的一個性質:轉義是密集的,也就是說,如果單引號出現在轉義的位置上,
--而該單引號后面緊跟(緊跟的定義為:兩個單引號之間是零距離的)的不是單引號,這個時候單引號就不在充當轉義的角色,而是與它前面的配對
end if;
dbms_output.put_line(v_sql);
execute immediate v_sql into v_empname;
dbms_output.put_line(v_empname);
end;

解釋:

紅色的部分為作用1,表示包含的內容為字符串(v_sql聲明類型是字符串型)。

 在oracle中,字符串是由單引號引用的,而轉義也是由單引號來完成的,這對於許多初學者而言是件頭疼的事情,尤其是開始學習動態SQL的人。如果就單純的單引號而言,很容易讓人理解:它總是找與它最近的一個單引號配對。也就是所謂的就近原則;但是在單引號充當轉義角色的時候,情況就比較讓人頭暈了。

請記住:

1,第一個單引號后的第二個單引號如果后面還有單引號,那么從第二個單引號開始被視為轉義符,比如下面這句話:

v_sql :=v_sql || ' and empname like ''%' || v_empname || '''';

’ and empname like ''' 中間兩個轉義為一個單引號' , 最后四個單引號'''' 中間兩個''轉義為一個單引號'

總結:

單引號轉義與非轉義的一個性質:轉義是密集的,也就是說,如果單引號出現在轉義的位置上,什么時候是出現在轉義的位置上,就是上面說過的,當第二個單引號后面還有單引號,此時分為兩種情況:

1,第二個單引號后面緊跟(緊跟的定義為:兩個單引號之間是零距離的)的是單引號,那么第二個單引號和緊跟着的第三個單引號作為轉義;

2,第二個單引號后面緊跟的不是單引號,這個時候單引號就不在充當轉義的角色,而是與它前面的配對。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM