procedure中使用临时表的问题,已解决,可供大家参考。
<p><font face="Verdana">li_xqjs = ds_xqjs.retrieve(left(sdate,6),left(u_sdate,6),left(u_edate,6))<br/>li_xqjs = ds_xqjs.retrieve(left(sdate,6),left(u_sdate,6),left(u_edate,6))</font></p><p> </p>
<p>上面的语句我写一次他不执行,重复写两次就执行了,为啥阿?</p>
<p> </p>
[此贴子已经被作者于2008-3-25 12:47:05编辑过]
<div class="t_msgfont" id="message5363874">我自己查到原因了,是procedure临时表的关系。</div>
<div class="t_msgfont"> </div>
<div class="t_msgfont">select into可以在事务中使用,但是前提条件是这个事务只有select into一条语句。<br/>SELECT INTO command not allowed within multi-statement transaction. <br/>注意是multi-statement transaction<br/>大家都知道,select into #tabel的最大优势是速度快,但这个速度快是用不记录日志来实现的。<br/>而使用事务的目的就是要么事务中的所有操作全部执行,要么所有操作全部回滚。<br/>这是靠日志中记录的操作来保证的。<br/>如果select into可以在多语句的事务中使用,但是它本身又是不计日志的,也就是不能回滚的。<br/>这就和事务的定义矛盾了。<br/>因此,select into不能在多语句的事务中使用。<br/>但也不是说我们不能使用select into这个好东东,set chained off,使用非链式事务或者把select into<br/>放在单独一个事务中运行就可以了。<br/>还有一个在多语句事务中被禁止的,而在应用中会常需要的命令是truncate table。<br/>原因和解决方法也如上所说。</div> <p>解决方案:</p>
<p>问题解决,其实问题出在数据库的设置上,为了能正确执行存储过程,只需在调用存储过程前加一条语句:sqlca.autocommit=true <br/> 执行完成后修改回原状态:sqlca.autocommit=true</p>
页:
[1]