//创建统计临时表
  qryTj.Close;
  qryTj.SQL.Text:='CREATE GLOBAL TEMPORARY TABLE tj(Name varchar2(20), rq varchar2(20), shl int)ON COMMIT PRESERVE ROWS';
  qryTj.ExecSQL;
在删除临时表时出错:
  qryTj.Close;
  qryTj.SQL.Text:='drop TABLE tj';
  qryTj.ExecSQL;提示错误为:ora-14452:试图创建、更改或删除正在使用的临时表中的索引
是什么问题?

解决方案 »

  1.   

    有session正在使用这个临时表
    看看程序里是不是有其他的dataset正在使用?是ADO么?
      

  2.   

    query和table都属于Tdataset型控件把所有用过临时表的数据控件包括ADOConnection free掉~
      

  3.   

    那么Free掉后还能执行drop table的命令了吗?
      

  4.   

    to bluemeteor(挂月||╭∩╮(︶_︶)╭∩╮) :
    我不太明白你的意思,是在drop table之前free掉数据控件呢,还是之后?之前free的话没有了数据控件就不能做drop table了,之后free则毫无意义,还是删不掉
    似乎free之后临时表也不会自动删除,那么到底是怎么回事呢?
      

  5.   

    free掉那些调用临时表的控件,比如ADOTable或者查询用的ADOQuery控件删除所用的query当然不能free了free的意思是要关闭所有存在的连接临时表的sessionADO的关闭连接很麻烦...
      

  6.   

    可是如果要free掉ADOConnection,那就删除就没有连接了,难道要再用一个ADOConnection控件?可不可以关闭连接再打开连接呢,ADO的关闭连接如何麻烦?connected=false;不是真正的关闭?
      

  7.   

    to  bluemeteor(挂月||╭∩╮(︶_︶)╭∩╮) 
    我怎么也关不掉连接呀,
      acConnection.Connected := false;
      qryTj.Active := false;
      acConnection.Connected := true;
      qryTemp.Close;
      qryTemp.SQL.Text:='drop table tj';
      qryTemp.ExecSQL;
    可是问题依旧
      

  8.   

    这说明你的数据表还在使用,而你却要删除掉它,当然不行了,如
    adoquery1.sql.add('select tmptable ');
    adoquery1.open;
    {...}
    adoquery1.close;
    {you must be add this code
    adoquery1.free;}
    adoqueyr2.sql.add('delete tmptable');
    adoquery2.execsql;//error,you can not delete the table
      

  9.   

    to  Drate(书虫) 
    现在我试过将adoquery1.free掉,包括adoconnection也free了,可是还不行呀
    还有什么地方需要free吗?dgGrid1? datasource1?
      

  10.   

    试试将它们free掉之前,设置相关属性为nil

    adoquery1.connection:= nil;
    adoquery1.free;adoconnection.connectionstring:= nil;
    adoconnection.free;
      

  11.   

    to  fancier(OP&&(C/C++)) 
    接你的方法试过了,也不成:(
      

  12.   

    还有一个奇怪的地方是,我在用MSSQL创建临时表时,在最后直接删除就可以,我现在遇到的问题是在使用oracle时遇到的