CREATE OR REPLACE procedure ×××
(......
......)
is
begin
select ......
.....;
create table **
(
a varchar2 not null,
......
);
end ×××;
这种方式建立临时表可以吗?
(......
......)
is
begin
select ......
.....;
create table **
(
a varchar2 not null,
......
);
end ×××;
这种方式建立临时表可以吗?
第二步:可以用 select * into #q from ABC 命令,其中#q是临时表名
var
TempTable:TClientDataSet;
begin
TempTable:=nil;
Result:=nil;
if AFieldDefs<>nil then
begin
try
TempTable:=TClientDataSet.Create(Application);
TempTable.FieldDefs.Assign(AFieldDefs);
TempTable.CreateDataSet;
Result:=(TempTable as TDataSet);
Except
if TempTable<>nil then
TempTable.Free; Result:=nil;
raise;
end
end
end; 在程序中按如下方法使用:
procedure TForm1.Button1Click(Sender: TObject);
var
ADataSet:TDataSet;
begin
ADataSet:=TDataSet.Create(Self);
with ADataSet.FieldDefs do
begin
Add(′Name′,ftString,30,False);
Add(′Value′,ftInteger,0,False);
end; with DataSource1 do
begin
DataSet:=CreateTableInMemory(ADataSet.FieldDefs);
DataSet.Open;
end; ADataSet.Free;
end;
要创建oracle真正意义的临时表,需加上temporary关键字 ,如:
create global temporary table testtable(a varchar2(20)) on commit preserve rows;
或
create global temporary table testtable(a varchar2(20)) on commit delete rows;
如果用delete,那么事务提交后临时表的数据就会删除,如果是preserve,那么是在session结束时数据被删除。
但是oracle的临时表与informix等系统的临时表有很大的区别,oracle的临时表是对所有session都可见的,只是数据对于各个session来说是独立的。可以在存储过程中使用
execute immediate '建表语句';
来创建临时表。
drop table #表名
create table #表名(字段)这样便可创建一个临时表
drop table #表名
以上语句即可
oracle的存储过程不支持临时表,只能改换思路或者用实际的表代替临时表工作(需要在每次使用该表前将它清空)