临时表的使用问题

时间:2022-09-08 09:05:28
用户查询的数据需要从表里抓出原始数据经过一定处理才能得到. 因为处理比较简单所以用临时表装载处理后的数据再用光标返回. 各位, 这样的思路有没有问题. 
   我的麻烦是每个用户查询的数据不一样, 临时表的结构就不一样. 所以应该在那里把创建的临时表删除掉, 怎样删除?

9 个解决方案

#1


如果想刪除則在處理數據之前判斷是否有你要用的表,如果有則刪除,否則新建一個。
---但是這樣不好,容易造成數據庫碎片,使oracle性能大大降低。
oracle里面的臨時表和固定表差不多,其實沒有必要刪除。不如建立一個比較多的字段的表,
然后再建立一個字段對照表(臨時表字段名,實際字段名/邏輯字段名).

#2


OK!

#3


估计你使用存储过程,所以可以在这里面使用execute immediate("drop table table1");
当然,jiezhi(浪子)说的有道理,其实不用删除,在使用完之后把数据清空即可!

#4


用户是在web页面上调用的这个查询,在一个session结束之前可能调用几次, 所以我要在调用一次之前先删除掉. 每个用户查询的数据不一样, 临时表的结构就不一样,所以建固定表不行.

#5


当然是不好了,字段不固定,用临时表来实现不方便。
建议你还是做成存储过程,在过程里面做处理,返回相关
的信息,这样做还方便一点。

#6


考虑一下用pl/sql 中的 集合

#7


怎么处理呢,比如说我的原始数据是每人每天的数据,现在我要汇出一些人一段时间里的数据和他们的汇总,不用临时表还有甚么更好的方式么.

#8


用过程返回记录集,用游标返回,这样比较容易

#9


我已经搞定了哈delphi+oracle+临时表,多会话情况下通过测试哈


---------------------------------------
 procedure Crt_TEMP_TBL(rc out rc_type1)
 is
sqlstr varchar2(4000);
begin
 if KXD.CHECK_TEMPTBL_Exist('KXD','delete_tbl')<>0 then 
  --删除临时表用truncate,在其它session中使用一样可以删掉
     sqlstr := 'TRUNCATE table delete_tbl';
     execute immediate sqlstr ;
  end if ;
  
  if KXD.CHECK_TEMPTBL_Exist('KXD','delete_tbl')=0 then 
  //建preserve,delete型临时表都可以看到最后结果,本着节约资源的原则当然用delete类//型了
    sqlstr :='Create global temporary table delete_tbl
              ON COMMIT delete ROWS 
               as select aastudent.* from aastudent';
    execute immediate sqlstr ;
  end if ;
 
  
--  insert into delete_tbl  select sid,sname,cid from aastudent;
  insert into delete_tbl values('cadd','cnadd','1000');
  open rc for select delete_tbl.* from delete_tbl;
 
 end ;


     END ;
 ----  insert into delete_tbl 的一句你注释,再不注释,测试就会发现上面的create global as select ..执行后的临时表中的数据仍然不空,所有上面的代码不爽,强烈建议只定义结构,不要为其赋值,再下面的insert into后数据会保存。临时表的结果通过游标返回.
通过游标返回数据集见贴:
http://expert.csdn.net/Expert/topic/2248/2248846.xml?temp=.4557154
我用的delphi,你的.net可能不一样哈.

#1


如果想刪除則在處理數據之前判斷是否有你要用的表,如果有則刪除,否則新建一個。
---但是這樣不好,容易造成數據庫碎片,使oracle性能大大降低。
oracle里面的臨時表和固定表差不多,其實沒有必要刪除。不如建立一個比較多的字段的表,
然后再建立一個字段對照表(臨時表字段名,實際字段名/邏輯字段名).

#2


OK!

#3


估计你使用存储过程,所以可以在这里面使用execute immediate("drop table table1");
当然,jiezhi(浪子)说的有道理,其实不用删除,在使用完之后把数据清空即可!

#4


用户是在web页面上调用的这个查询,在一个session结束之前可能调用几次, 所以我要在调用一次之前先删除掉. 每个用户查询的数据不一样, 临时表的结构就不一样,所以建固定表不行.

#5


当然是不好了,字段不固定,用临时表来实现不方便。
建议你还是做成存储过程,在过程里面做处理,返回相关
的信息,这样做还方便一点。

#6


考虑一下用pl/sql 中的 集合

#7


怎么处理呢,比如说我的原始数据是每人每天的数据,现在我要汇出一些人一段时间里的数据和他们的汇总,不用临时表还有甚么更好的方式么.

#8


用过程返回记录集,用游标返回,这样比较容易

#9


我已经搞定了哈delphi+oracle+临时表,多会话情况下通过测试哈


---------------------------------------
 procedure Crt_TEMP_TBL(rc out rc_type1)
 is
sqlstr varchar2(4000);
begin
 if KXD.CHECK_TEMPTBL_Exist('KXD','delete_tbl')<>0 then 
  --删除临时表用truncate,在其它session中使用一样可以删掉
     sqlstr := 'TRUNCATE table delete_tbl';
     execute immediate sqlstr ;
  end if ;
  
  if KXD.CHECK_TEMPTBL_Exist('KXD','delete_tbl')=0 then 
  //建preserve,delete型临时表都可以看到最后结果,本着节约资源的原则当然用delete类//型了
    sqlstr :='Create global temporary table delete_tbl
              ON COMMIT delete ROWS 
               as select aastudent.* from aastudent';
    execute immediate sqlstr ;
  end if ;
 
  
--  insert into delete_tbl  select sid,sname,cid from aastudent;
  insert into delete_tbl values('cadd','cnadd','1000');
  open rc for select delete_tbl.* from delete_tbl;
 
 end ;


     END ;
 ----  insert into delete_tbl 的一句你注释,再不注释,测试就会发现上面的create global as select ..执行后的临时表中的数据仍然不空,所有上面的代码不爽,强烈建议只定义结构,不要为其赋值,再下面的insert into后数据会保存。临时表的结果通过游标返回.
通过游标返回数据集见贴:
http://expert.csdn.net/Expert/topic/2248/2248846.xml?temp=.4557154
我用的delphi,你的.net可能不一样哈.