プロシージャ間でテンポラリ・テーブルを共有すると、テーブル定義が矛盾している場合に問題が発生する場合があります。たとえば、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 文のキャッシュされた表現を使用します。そのため、結果が異なります。
次のいずれかを実行すると、このような状況の発生を防ぐことができます。
このような方法で使用されるテンポラリ・テーブルは、一致するように定義する
代わりにグローバル・テンポラリ・テーブルを使用することを検討する
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |