excuse immediate的两个用法

1、用在存储过程中

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

2、给SQL语句动态传递值

PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别:

 在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下:

select * from dual;
v_sql:='select * from dual'; EXECUTE IMMEDIATE v_sql; 

一般来说直接写SQL的性能是高于拼字符串的,因为如果执行拼字符串的需要内部自动调动oracle机制,先解析字符串映射成SQL语句然后再执行。

 但是拼SQL的方式有好处。即SQL语句是一个字符串可以动态拼接,根据不同的条件来改变SQL语句,这是直接写SQL所不能达到的。拼SQL还有个好处就是:

v_sql:='select * from tables t where t.c_date=:1 and t.name=:2';
  EXECUTE IMMEDIATE v_sql USING '20180727','zhangsan';

可以动态的对参数传递值,这是最大的优势。

 在PL/SQL中定义一个变量  v_date varchar2。如果直接写SQL可以直接写变量 v_date;如果是拼SQL则是:

v_sql:='select * from tables t where t.c_date='''||v_date||''''; 

 这样在执行的时候打印出来的SQL就是:

select * from tables t where t.c_date='20180727'

如果是:

v_sql:='select * from tables t where t.c_date='||v_date||'';  

这样在执行的时候打印出来的SQL就是:

select * from tables t where t.c_date=20180727;  

这里c_date如果是varchar2类型,则这里oracle要隐式的进行数字到字符串的转换  ,影响性能。

你可能感兴趣的:(数据库,immediate)