作用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,第二个单引号后面紧跟的不是单引号,这个时候单引号就不在充当转义的角色,而是与它前面的配对。
