execute immediate使用变量拼接字符串

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
https://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=1942

 

执行动态sql语句,如果要使用变量拼接字符串,这样写。

  1. <span style="font-size:14px; font-family: Arial, Helvetica, sans-serif;"></span><p><strong style="font-family: 'Microsoft YaHei'; font-size: 12px; "></strong></p> 

简单来说 就是你一个存储过程当中 创建了一个表 table_a 然后要用insert into将其他的数据插入到这个table_a当中,但是因为你在创建过程的时候 table_a还不存在,过程就会显示有编译错误,因为table_a不存在必然导致过程无法执行,所以无法编译成功,而把insert into语句加如到 execute immediate之后 则oracle不会再去理会这个对象是否存在,因此可以成功编译和执行。

[sql] view plain copy

  1. <span style="font-size:14px; font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="sql" style="font-size:18px; display: inline !important;"><span style="font-size:14px; font-family: Arial, Helvetica, sans-serif;"></span>  

[sql] view plain copy

  1. <span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px;">SQL> BEGIN</span></span>  

[sql] view plain copy

  1. <span style="font-size:14px;">2  EXECUTE IMMEDIATE ( 'SELECT * FROM test_dysql WHERE id=1' );  
  2. END;  
  3. 4 /  
  4. PL/SQL procedure successfully completed. </span>  

execute immediate  是用于在 存储过程里面.  动态的执行 SQL 语句。

例如:

有个存储过程, 用于检索表的行数。  传入的参数是 表的名称。

这种情况下,你

SELECT count(*) FROM  v_变量

是无法执行的。

 

你只能定义一个变量  vsql  varchar2(100);

然后

vsql = 'SELECT count(*) FROM '  ||   v_变量

然后调用  EXECUTE IMMEDIATE   来执行。

 

动态SQL,意思就是你需要执行的 SQL 语句, 不是固定的。要等运行的时候, 才能确定下来。

也就像上面那个例子,表名是 外部传入的。

不过 动态SQL 与 EXECUTE IMMEDIATE  主要用在 存储过程里面。

其他:

EXECUTE IMMEDIATE 'select * from xxx_'||to_char(SYSDATE,'mm')||';'

比如

v_sql:='insert into tmp_table as select * from '||v_table;

EXECUTE IMMEDIATE v_sql;

这里的v_table这个变量就是不确定的表名

[sql] view plain copy

  1. <span style="font-size:14px;">create or replace procedure test_proc  
  2. as  
  3. begin  
  4.     execute immediate '  
  5.     create global temporary table T_AB    as   
  6.     select   
  7.         A.id_,   
  8.         A.name_,   
  9.         B.num_  
  10. 10.     from   
  11. 11.         T_A A,   
  12. 12.         T_B B   
  13. 13.     where   
  14. 14.         A.id_=B.id_';  

end;</span> 

 

 

GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
https://cnsendnet.taobao.com
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=1942

posted on   森大科技  阅读(364)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-10-05 oracle 10g和11g的互相导入和导出

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示