我的麻烦是每个用户查询的数据不一样, 临时表的结构就不一样. 所以应该在那里把创建的临时表删除掉, 怎样删除?
9 个解决方案
#1
如果想刪除則在處理數據之前判斷是否有你要用的表,如果有則刪除,否則新建一個。
---但是這樣不好,容易造成數據庫碎片,使oracle性能大大降低。
oracle里面的臨時表和固定表差不多,其實沒有必要刪除。不如建立一個比較多的字段的表,
然后再建立一個字段對照表(臨時表字段名,實際字段名/邏輯字段名).
---但是這樣不好,容易造成數據庫碎片,使oracle性能大大降低。
oracle里面的臨時表和固定表差不多,其實沒有必要刪除。不如建立一個比較多的字段的表,
然后再建立一個字段對照表(臨時表字段名,實際字段名/邏輯字段名).
#2
OK!
#3
估计你使用存储过程,所以可以在这里面使用execute immediate("drop table table1");
当然,jiezhi(浪子)说的有道理,其实不用删除,在使用完之后把数据清空即可!
当然,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可能不一样哈.
---------------------------------------
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里面的臨時表和固定表差不多,其實沒有必要刪除。不如建立一個比較多的字段的表,
然后再建立一個字段對照表(臨時表字段名,實際字段名/邏輯字段名).
---但是這樣不好,容易造成數據庫碎片,使oracle性能大大降低。
oracle里面的臨時表和固定表差不多,其實沒有必要刪除。不如建立一個比較多的字段的表,
然后再建立一個字段對照表(臨時表字段名,實際字段名/邏輯字段名).
#2
OK!
#3
估计你使用存储过程,所以可以在这里面使用execute immediate("drop table table1");
当然,jiezhi(浪子)说的有道理,其实不用删除,在使用完之后把数据清空即可!
当然,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可能不一样哈.
---------------------------------------
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可能不一样哈.