1.单引号的作用
在oracle中单引号主要有两个作用: 一是字符串都用单引号引用,例如'abc';二是转义符,转义符在使用时一般会出现多个连在一起的单引号,相对难理解一些。下面举例说明。
实例1:select '''' from dual;
实例1结果:
实例2:select 'oracle''' from dual;
实例2结果:
实例1解析:第一个和第四个单引号是成对出现的,作用是把字符串引起来;第二个单引号表示转义符号,第三个单引号表示被转义的符号,就是此时第三个单引号在转义符号的作用下就代表单引号“ ' ”本身。
实例2解析:'oracle'''可以拆分成4部分,①:' 、②:oracle、③:'' 、④:',其中①④成对出现,表示把中间的字符串内容引起来,②表示字符串:oracle,③利用转义符将单引号本身转义,表示单引号字符串:';所以最终①④中间的字符串内容是oracle' 。
2.在动态sql中字符串和变量拼接
2.1拼接要点:
(1)最外边上的两个单引号是引用字符串的固定写法;
(2)中间两个紧紧相连的单引号表示单引号本身(例如' ' : 第一个单引号表是转义字符,用来转义后面的字符;第二个单引号是被转义的字符,表示单引号字符本身,这里不起到把字符串引起来的作用)
2.2存过代码
create or replace procedure P_TEST(v_djxh in number) is
v_str varchar2(500);
v_var1 varchar2(100);
v_var2 varchar2(100);
BEGIN
--传入参数 v_djxh => 12345 ,变量v_var1的值是:AED0B
select trim(ZLBSCJUUID) into v_var1 from tmp_dm0_fbcw_bslqc where DJXH = v_djxh;
v_str := 'update j1_tgq.SB_CWBB_CJTJJ_ZCFZB set uuid=''qwer'' where ZLBSCJUUID = '''||v_var1||''' ';
execute immediate v_str;
commit;
dbms_output.put_line('v_str:'||v_str);
END;
打印结果:
2.3解析
'update j1_tgq.SB_CWBB_CJTJJ_ZCFZB set uuid=''qwer'' where ZLBSCJUUID = '' ' ||v_var1|| ' '' ' 可以分成五部分,如下图.
第①部分: 'update j1_tgq.SB_CWBB_CJTJJ_ZCFZB set uuid=''qwer'' where ZLBSCJUUID = '' ' 解析后为update j1_tgq.SB_CWBB_CJTJJ_ZCFZB set uuid='qwer' where ZLBSCJUUID = '
第②部分: || 代表拼接符
第③部分:v_var1 代表变量 解析后为 AED0B
第④部分: || 代表拼接符
第⑤部分:' '' ' 解析后为 单引号本身'
所以五个部分拼接起来解析后的结果是:update j1_tgq.SB_CWBB_CJTJJ_ZCFZB set uuid='qwer' where ZLBSCJUUID = 'AED0B'
下面是存储过程中的一段代码:
ls_sql := 'select listagg(''''''''||gb_dm||'''''' as col_''||gb_dm,'','') within group (order by gb_dm) from (select distinct gb_dm from v_DM2_GJS_SDS_FJM_GB_hh45_10)';
dbms_output.put_line(ls_sql); --打印变量ls_sql的值
①:ls_sql的打印结果:select listagg(''''||gb_dm||''' as col_'||gb_dm,',') within group (order by gb_dm) from (select distinct gb_dm from v_DM2_GJS_SDS_FJM_GB_hh45_10)
②:plsql窗口执行①的结果 : '270' as col_270, '275' as col_275, '276' as col_276, '288' as col_288, '328' as col_328, 'QT' as col_QT