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 2021-10-05 22:04  森大科技  阅读(361)  评论(0编辑  收藏  举报

导航