EXECUTE IMMEDIATE总结
oracle的execute immediate可以动态执行sql语句。下面总结一下这一语句的用法:<br><br>
<b>1. execute immediate不会自动提交DML事务执行,需要显式提交或者作为execute immediate语句的一部分。</b>(参考如下代码)<br>
<blockquote>
<div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">SQL<span style="color:#0000CC;">></span> <span style="color:#0000FF;">create</span> <span style="color:#0000FF;">table</span> PEOPLE_T<span style="color:#0000CC;">(</span><br></span></li><li>
2 id <span style="color:#0000FF;">number</span><span style="color:#0000CC;">,</span><br></li><li>
3 name <span style="color:#0000FF;">varchar</span><span style="color:#0000CC;">(</span>50<span style="color:#0000CC;">)</span><br></li><li>
4 <span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
<br></li><li>
<span style="color:#0000FF;">Table</span> created<br></li><li>
SQL<span style="color:#0000CC;">></span> <span style="color:#0000FF;">set</span> serveroutput <span style="color:#0000FF;">on</span><span style="color:#0000CC;">;</span><br></li><li>
SQL<span style="color:#0000CC;">></span> declare<br></li><li>
2 cnt <span style="color:#0000FF;">integer</span><span style="color:#0000CC;">;</span><br></li><li>
3<span style="color:#0000FF;">begin</span><br></li><li>
4 <span style="color:#FF0000;">execute</span> <span style="color:#0000FF;">immediate</span> <span style="color:#FF00FF;">'insert into people_t values(1, '</span><span style="color:#FF00FF;">'zhangsan'</span><span style="color:#FF00FF;">')'</span><span style="color:#0000CC;">;</span><br></li><li>
5 rollback<span style="color:#0000CC;">;</span><br></li><li>
6 <span style="color:#0000FF;">select</span> <span style="color:#FF0000;">count</span><span style="color:#0000CC;">(</span><span style="color:#0000CC;">*</span><span style="color:#0000CC;">)</span> <span style="color:#0000FF;">into</span> cnt <span style="color:#0000FF;">from</span> people_t<span style="color:#0000CC;">;</span><br></li><li>
7 dbms_output<span style="color:#0000CC;">.</span>put_line<span style="color:#0000CC;">(</span>cnt<span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
8<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
9<span style="color:#0000CC;">/</span><br></li><li>
<br></li><li>
0<br></li><li>
<br></li><li>
PL<span style="color:#0000CC;">/</span>SQL procedure successfully completed<br></li><li>
<br></li><li>
SQL<span style="color:#0000CC;">></span></li></ol></div>
</blockquote>
上面的代码和结果可以证明,execute immediate并不自动提交DML操作。下面的代码中,我们手动提交:<br><blockquote><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">SQL<span style="color:#0000CC;">></span> declare<br></span></li><li>
2 cnt <span style="color:#0000FF;">integer</span><span style="color:#0000CC;">;</span><br></li><li>
3<span style="color:#0000FF;">begin</span><br></li><li>
4 <span style="color:#FF0000;">execute</span> <span style="color:#0000FF;">immediate</span> <span style="color:#FF00FF;">'insert into people_t values (2, '</span><span style="color:#FF00FF;">'Lisi'</span><span style="color:#FF00FF;">')'</span><span style="color:#0000CC;">;</span><br></li><li>
5 commit<span style="color:#0000CC;">;</span><br></li><li>
6 <span style="color:#0000FF;">select</span> <span style="color:#FF0000;">count</span><span style="color:#0000CC;">(</span><span style="color:#0000CC;">*</span><span style="color:#0000CC;">)</span> <span style="color:#0000FF;">into</span> cnt <span style="color:#0000FF;">from</span> people_t<span style="color:#0000CC;">;</span><br></li><li>
7 dbms_output<span style="color:#0000CC;">.</span>put_line<span style="color:#0000CC;">(</span>cnt <span style="color:#0000CC;">|</span><span style="color:#0000CC;">|</span> <span style="color:#FF00FF;">' records after commit'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
8<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
9<span style="color:#0000CC;">/</span><br></li><li>
<br></li><li>
1 records after commit<br></li><li>
<br></li><li>
PL<span style="color:#0000CC;">/</span>SQL procedure successfully completed</li></ol></div></blockquote>可以看出手动提交后,DML语句的记录才插进表里。当然也可以用下面的方式动态执行提交语句,但是与手动提交没有太大的实际意义:<br><blockquote><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">SQL<span style="color:#0000CC;">></span> declare<br></span></li><li>
2 cnt <span style="color:#0000FF;">integer</span><span style="color:#0000CC;">;</span><br></li><li>
3<span style="color:#0000FF;">begin</span><br></li><li>
4 <span style="color:#FF0000;">execute</span> <span style="color:#0000FF;">immediate</span> <span style="color:#FF00FF;">'insert into people_t values (3, '</span><span style="color:#FF00FF;">'Wangwu'</span><span style="color:#FF00FF;">')'</span><span style="color:#0000CC;">;</span><br></li><li>
5 <span style="color:#FF0000;">execute</span> <span style="color:#0000FF;">immediate</span> <span style="color:#FF00FF;">'commit'</span><span style="color:#0000CC;">;</span><br></li><li>
6 <span style="color:#0000FF;">select</span> <span style="color:#FF0000;">count</span><span style="color:#0000CC;">(</span><span style="color:#0000CC;">*</span><span style="color:#0000CC;">)</span> <span style="color:#0000FF;">into</span> cnt <span style="color:#0000FF;">from</span> people_t<span style="color:#0000CC;">;</span><br></li><li>
7 dbms_output<span style="color:#0000CC;">.</span>put_line<span style="color:#0000CC;">(</span>cnt <span style="color:#0000CC;">|</span><span style="color:#0000CC;">|</span> <span style="color:#FF00FF;">' records after commit'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
8<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
9<span style="color:#0000CC;">/</span><br></li><li>
<br></li><li>
2 records after commit<br></li><li>
<br></li><li>
PL<span style="color:#0000CC;">/</span>SQL procedure successfully completed<br></li><li>
<br></li><li>
SQL<span style="color:#0000CC;">></span></li></ol></div></blockquote><b>2. 当执行sql语句时,结尾不需要分号;当执行pl/sql块时,需要用分号结尾。</b><br> <br> 下面的代码展示了错误的语法:<br><blockquote><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">SQL<span style="color:#0000CC;">></span> <span style="color:#0000FF;">begin</span><br></span></li><li>
2 <span style="color:#FF0000;">execute</span> <span style="color:#0000FF;">immediate</span> <span style="color:#FF00FF;">'insert into people_t values (1, '</span><span style="color:#FF00FF;">'Zhangsan'</span><span style="color:#FF00FF;">');'</span><span style="color:#0000CC;">;</span><br></li><li>
3<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
4<span style="color:#0000CC;">/</span><br></li><li>
<br></li><li>
<span style="color:#0000FF;">begin</span><br></li><li>
<span style="color:#FF0000;">execute</span> <span style="color:#0000FF;">immediate</span> <span style="color:#FF00FF;">'insert into people_t values (1, '</span><span style="color:#FF00FF;">'Zhangsan'</span><span style="color:#FF00FF;">');'</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
<br></li><li>
ORA<span style="color:#0000CC;">-</span>00911<span style="color:#0000CC;">:</span> invalid character<br></li><li>
ORA<span style="color:#0000CC;">-</span>06512<span style="color:#0000CC;">:</span> at line 3<br></li><li>
<br></li><li>
SQL<span style="color:#0000CC;">></span></li></ol></div></blockquote><blockquote><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">SQL<span style="color:#0000CC;">></span> <span style="color:#0000FF;">begin</span><br></span></li><li>
2 <span style="color:#FF0000;">execute</span> <span style="color:#0000FF;">immediate</span> <span style="color:#FF00FF;">'begin insert into people_t values (1, '</span><span style="color:#FF00FF;">'Zhangsan'</span><span style="color:#FF00FF;">'); end'</span><span style="color:#0000CC;">;</span><br></li><li>
3<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
4<span style="color:#0000CC;">/</span><br></li><li>
<br></li><li>
<span style="color:#0000FF;">begin</span><br></li><li>
<span style="color:#FF0000;">execute</span> <span style="color:#0000FF;">immediate</span> <span style="color:#FF00FF;">'begin insert into people_t values (1, '</span><span style="color:#FF00FF;">'Zhangsan'</span><span style="color:#FF00FF;">'); end'</span><span style="color:#0000CC;">;</span><br></li><li>
<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
<br></li><li>
ORA<span style="color:#0000CC;">-</span>06550<span style="color:#0000CC;">:</span> line 1<span style="color:#0000CC;">,</span> <span style="color:#0000FF;">column</span> 54<span style="color:#0000CC;">:</span><br></li><li>
PLS<span style="color:#0000CC;">-</span>00103<span style="color:#0000CC;">:</span> Encountered the symbol <span style="color:#FF00FF;">"end-of-file"</span> when expecting one <span style="color:#0000FF;">of</span> the following<span style="color:#0000CC;">:</span><br></li><li>
<br></li><li>
<span style="color:#0000CC;">;</span> <span style="color:#0000CC;"><</span>an identifier<span style="color:#0000CC;">></span> <span style="color:#0000CC;"><</span>a <span style="color:#0000FF;">double</span><span style="color:#0000CC;">-</span>quoted delimited<span style="color:#0000CC;">-</span>identifier<span style="color:#0000CC;">></span><br></li><li>
The symbol <span style="color:#FF00FF;">";"</span> was substituted <span style="color:#0000FF;">for</span> <span style="color:#FF00FF;">"end-of-file"</span> <span style="color:#0000FF;">to</span> <span style="color:#FF0000;">continue</span><span style="color:#0000CC;">.</span><br></li><li>
ORA<span style="color:#0000CC;">-</span>06512<span style="color:#0000CC;">:</span> at line 3<br></li><li>
<br></li><li>
SQL<span style="color:#0000CC;">></span></li></ol></div></blockquote><br><br>
页:
[1]