oracle存储过程动态sql单引号拼接和变量拼接

it2023-07-18  68

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

 

最新回复(0)