Firebird:模拟创建表格为?

时间:2013-03-25 08:12:56

标签: delphi stored-procedures firebird temp-tables create-table

我正在寻找一种方法来模拟来自SP的Firebird中的“create table as select”。

我们经常在另一个产品中使用此语句,因为它很容易制作较小的可索引集,并在服务器端提供非常快速的结果。

create temp table a select * from xxx where ...
create indexes on a ...
create temp table b select * from xxx where ...
create indexes on b ...

select * from a
union
select * from b

或者避免子查询中的三个或更多级别。

select * 
from a where id in (select id 
                    from b 
                    where ... and id in (select id from c where))

“create table as select”非常好,因为它提供了正确的字段类型和名称,所以我不需要预先定义它们。

我可以使用Delphi在Firebird中模拟“create table as”:

选择没有行的select,获取表字段类型,将它们转换为create table SQL,运行它,并使“insert into temp table”+ chooseql with rows(without order by)。 没关系。

但是我可以在一个获取select sql的公共存储过程中创建相同的东西,并创建一个带有结果的新临时表吗?

所以:我可以获取查询结果的字段类型,我可以从中创建字段创建者SQL吗?

我只是问是否有办法(然后我必须指定列)。

1 个答案:

答案 0 :(得分:2)

Firebird不支持在存储过程中执行DDL。您可以使用EXECUTE STATEMENT执行此操作,但不建议这样做(请参阅“No data returned”主题末尾的警告)。

使用(事务级别)Global Temporary Table的一种方法是使用“临时集”。创建GTT作为数据库的一部分,具有正确的数据类型但没有约束(当你只填充一些列而不是所有列时,这些可能会进入) - 然后每个事务只看到它自己的表和数据版本...... < / p>