1

SPのFirebirdで「テーブルを選択として作成」をシミュレートする方法を探しています。

このステートメントは、別の製品で頻繁に使用されています。これは、インデックス付け可能なセットを少なくするのが非常に簡単で、サーバー側で非常に高速な結果を提供するためです。

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

または、サブクエリの3つ以上のレベルを回避します。

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

「テーブルを選択として作成」は非常に優れており、正しいフィールドタイプと名前が提供されるため、事前に定義する必要はありません。

Delphiを使用してFirebirdで「createtableas」をシミュレートできます。

行なしでselectを作成し、テーブルフィールドタイプを取得し、それらを変換してテーブルSQLを作成して実行し、「insert intotemptable」+selectsqlwith rows(order byなし)を作成します。大丈夫です。

しかし、select sqlを取得し、その結果を使用して新しい一時テーブルを作成する一般的なストアドプロシージャで同じものを作成できますか?

だから:クエリ結果のフィールドタイプを取得して、それらからフィールドクリエーターSQLを作成できますか?

方法があるかどうかを尋ねているだけです(次に、列を指定する必要があります)。

4

1 に答える 1

2

ストアドプロシージャ内でのDDLの実行は、Firebirdではサポートされていません。EXECUTE STATEMENTを使用してこれを行うことはできますが、お勧めしません(「データが返されません」トピックの最後にある警告を参照してください)。

「一時セット」を作成する1つの方法は、(トランザクションレベルの)グローバル一時テーブルを使用することです。正しいデータ型を使用して、ただし制約なしでGTTをデータベースの一部として作成します(すべてではなく一部の列のみに入力すると、おそらくそれらが邪魔になります)-その後、各トランザクションは、独自のバージョンのテーブルとデータのみを参照します...

于 2013-03-25T09:06:02.920 に答える