oracle pl/sql程序之变量拼接

oracle在编写pl/sql程序块的时候,需要拼接变量以正确的得到执行结果,测试如下:

declare 
  v_insert_sql_0 clob;
  v_insert_sql clob;
  v_insert_sql_1 clob;
  v_insert_sql_2 clob;
  v_insert_sql_3 clob;
  v_insert_sql_4 clob;
  v_insert_sql_5 clob;
  v_n varchar2(100);
  cursor d is 
     select * from hx_bak.gd_20200509 where v_name in ('张三') order by id;
begin
  for d1 in d loop
   select d1.v_name into v_n from dual;
   
  -- 测试1  可成功执行
   v_insert_sql_0 := 'insert into hx_bak.gd_20200511 ';
   v_insert_sql := v_insert_sql_0||'select * from hx_bak.gd_20200509 a where a.v_name=''';   #  解释:此处第一个'用于转义,类似于shell脚本中的\,使一些特殊字符作为普通字符,第二个'就是普通字符,第三个字符用于||的拼接
   dbms_output.put_line(v_insert_sql);  
   输出结果:insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name='
 
   v_insert_sql_1 := v_insert_sql||v_n||'''';--正确的方式    # 解释:此处第一个'用于拼接,第二个'用于转义,类似于shell脚本中的\,使一些特殊字符作为普通字符,第三个'就是普通字符,第四个字符用于||的拼接
   dbms_output.put_line('测试1的结果:'||v_insert_sql_1);  
   输出结果:测试1的结果:insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name='张三'
   execute immediate v_insert_sql_1; --可成功执行
  
  -- 测试1.1
   v_insert_sql_1 := v_insert_sql||v_n||''';';--错误的方式
   dbms_output.put_line('测试1.1的结果:'||v_insert_sql_1);  
   输出结果:测试1.1的结果:insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name='张三';
 --  execute immediate v_insert_sql_1; --不可成功执行,所以在v_insert_sql_1不能加 ;号
  
  -- 测试2
  v_insert_sql_2 := v_insert_sql||v_n||'''哈哈;'; --测试,可正常打印     解释:此处第一个'用于拼接,第二个'用于转义,类似于shell脚本中的\,使一些特殊字符作为普通字符,第三个'就是普通字符,第四个字符用于||的拼接
  dbms_output.put_line('测试2的结果:'||v_insert_sql_2);  
  输出结果:测试2的结果:insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name='张三'哈哈;
  --execute immediate v_insert_sql_1;
  
  -- 测试3
  v_insert_sql_3 := v_insert_sql||v_n||';';--错误的方式
  dbms_output.put_line('测试3的结果:'||v_insert_sql_3);  
  输出结果:测试3的结果:insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name='张三;
  --execute immediate v_insert_sql_2;
  
  -- 测试4
   v_insert_sql := 'insert into hx_bak.gd_20200511 ';
   v_insert_sql := v_insert_sql||'select * from hx_bak.gd_20200509 a where a.v_name=';
   dbms_output.put_line(v_insert_sql);  -- insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name=
   v_insert_sql_4 := v_insert_sql||v_n||';'; --错误的方式
   dbms_output.put_line('测试4的结果:'||v_insert_sql_4);  
   输出结果:测试4的结果:insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name=张三;
  --execute immediate v_insert_sql_4; --不可成功执行
  
  -- 测试5   可成功执行
   v_insert_sql := 'insert into hx_bak.gd_20200511 ';
   v_insert_sql := v_insert_sql||'select * from hx_bak.gd_20200509 a where a.v_name=';
   dbms_output.put_line(v_insert_sql); 
   输出结果:insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name=
   v_insert_sql_5 := v_insert_sql||''''||v_n||''''; --正确的方式   解释:此处第一个'用于拼接,第二个'用于转义,类似于shell脚本中的\,使一些特殊字符作为普通字符,第三个'就是普通字符,第四个字符用于||的拼接
   dbms_output.put_line('测试5的结果:'||v_insert_sql_5); 
   输出结果:测试5的结果:insert into hx_bak.gd_20200511 select * from hx_bak.gd_20200509 a where a.v_name='张三'
   execute immediate v_insert_sql_5;--可成功执行
  end loop;
end;
/




你可能感兴趣的:(oracle)