3legcat 发表于 2011-12-22 08:54

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;">&gt;</span> <span style="color:#0000FF;">create</span> <span style="color:#0000FF;">table</span> PEOPLE_T<span style="color:#0000CC;">(</span><br></span></li><li>
&nbsp;&nbsp;2 id <span style="color:#0000FF;">number</span><span style="color:#0000CC;">,</span><br></li><li>
&nbsp;&nbsp;3 name <span style="color:#0000FF;">varchar</span><span style="color:#0000CC;">(</span>50<span style="color:#0000CC;">)</span><br></li><li>
&nbsp;&nbsp;4 <span style="color:#0000CC;">)</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;<br></li><li>
<span style="color:#0000FF;">Table</span> created<br></li><li>
SQL<span style="color:#0000CC;">&gt;</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;">&gt;</span> declare<br></li><li>
&nbsp;&nbsp;2    cnt <span style="color:#0000FF;">integer</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;3<span style="color:#0000FF;">begin</span><br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;5    rollback<span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;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>
&nbsp;&nbsp;8<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;9<span style="color:#0000CC;">/</span><br></li><li>
&nbsp;<br></li><li>
0<br></li><li>
&nbsp;<br></li><li>
PL<span style="color:#0000CC;">/</span>SQL procedure successfully completed<br></li><li>
&nbsp;<br></li><li>
SQL<span style="color:#0000CC;">&gt;</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;">&gt;</span> declare<br></span></li><li>
&nbsp;&nbsp;2    cnt <span style="color:#0000FF;">integer</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;3<span style="color:#0000FF;">begin</span><br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;5    commit<span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;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>
&nbsp;&nbsp;8<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;9<span style="color:#0000CC;">/</span><br></li><li>
&nbsp;<br></li><li>
1 records after commit<br></li><li>
&nbsp;<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;">&gt;</span> declare<br></span></li><li>
&nbsp;&nbsp;2    cnt <span style="color:#0000FF;">integer</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;3<span style="color:#0000FF;">begin</span><br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;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>
&nbsp;&nbsp;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>
&nbsp;&nbsp;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>
&nbsp;&nbsp;8<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;9<span style="color:#0000CC;">/</span><br></li><li>
&nbsp;<br></li><li>
2 records after commit<br></li><li>
&nbsp;<br></li><li>
PL<span style="color:#0000CC;">/</span>SQL procedure successfully completed<br></li><li>
&nbsp;<br></li><li>
SQL<span style="color:#0000CC;">&gt;</span></li></ol></div></blockquote><b>2. 当执行sql语句时,结尾不需要分号;当执行pl/sql块时,需要用分号结尾。</b><br>&nbsp;&nbsp; <br>&nbsp;&nbsp; 下面的代码展示了错误的语法:<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;">&gt;</span> <span style="color:#0000FF;">begin</span><br></span></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;3<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;4<span style="color:#0000CC;">/</span><br></li><li>
&nbsp;<br></li><li>
<span style="color:#0000FF;">begin</span><br></li><li>
&nbsp;&nbsp;<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>
&nbsp;<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>
&nbsp;<br></li><li>
SQL<span style="color:#0000CC;">&gt;</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;">&gt;</span> <span style="color:#0000FF;">begin</span><br></span></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;3<span style="color:#0000FF;">end</span><span style="color:#0000CC;">;</span><br></li><li>
&nbsp;&nbsp;4<span style="color:#0000CC;">/</span><br></li><li>
&nbsp;<br></li><li>
<span style="color:#0000FF;">begin</span><br></li><li>
&nbsp;&nbsp;<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>
&nbsp;<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>
&nbsp;&nbsp;&nbsp;<span style="color:#0000CC;">;</span> <span style="color:#0000CC;">&lt;</span>an identifier<span style="color:#0000CC;">&gt;</span> <span style="color:#0000CC;">&lt;</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;">&gt;</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>
&nbsp;<br></li><li>
SQL<span style="color:#0000CC;">&gt;</span></li></ol></div></blockquote><br><br>
页: [1]
查看完整版本: EXECUTE IMMEDIATE总结