プロシージャ間でテンポラリテーブルを共有すると、テーブル定義が矛盾している場合に問題が発生する場合があります。たとえば、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 文のキャッシュされた表現を使用します。そのため、結果が異なります。
次のいずれかを実行すると、このような状況の発生を防ぐことができます。
このような方法で使用されるテンポラリテーブルは、一致するように定義する
代わりにグローバルテンポラリテーブルを使用する
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |