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

SAP Sybase SQL Anywhere 16.0 » 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 文のキャッシュされた表現を使用します。そのため、結果が異なります。

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

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

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