Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » テーブル、ビュー、インデックス » テンポラリテーブル

 

プロシージャー内でのテンポラリテーブルの参照

プロシージャー間でテンポラリテーブルを共有すると、テーブル定義が矛盾している場合に問題が発生する場合があります。たとえば、procA と procB という 2 つのプロシージャーがあり、その両方がテンポラリテーブル temp_table を定義して、sharedProc という名前の別のプロシージャーを呼び出すとします。procA と procB のどちらもまだ呼び出されていないため、テンポラリテーブルはまだ存在しません。

ここで、procA の temp_table の定義が procB の定義と少し異なるとします。両方とも同じカラム名と型を使用していますが、カラムの順序が異なります。

procA を呼び出すと、予期した結果が返されます。一方で、procB を呼び出すと、異なる結果が返されます。

これは、procA が呼び出されたときに temp_table が作成され、その後で sharedProc が呼び出されたためです。sharedProc が呼び出されると、内部の SELECT 文が解析および検証され、その後、別の SELECT 文が実行されたときに使用できるように、解析された文の表現がキャッシュされます。キャッシュされたバージョンは、procA のテーブル定義のカラムの順序を反映しています。

procB を呼び出すと temp_table が再作成されますが、カラムの順序が異なります。procB が sharedProc を呼び出すと、データベースサーバーは SELECT 文のキャッシュされた表現を使用します。そのため、結果が異なります。

次のいずれかを実行すると、このような状況の発生を防ぐことができます。

  • このような方法で使用されるテンポラリテーブルは、一致するように定義する

  • 代わりにグローバルテンポラリテーブルを使用することを検討する