ローカル一時テーブルが存在するかどうかをチェックする SQL IF 文を書きたいのですが、そのようなテーブルは SQL Anywhere システム カタログに記録されていません。
3 に答える
これは 11.0.1 以降で実行できることに注意してください。
DROP TABLE IF EXISTS t;
「ローカル一時テーブルが存在しない場合、エラーを発生させずに削除するにはどうすればよいですか?」という質問をしている場合は、答えは簡単です:それをドロップしてエラーを無視してください:
BEGIN
DROP TABLE t;
EXCEPTION WHEN OTHERS THEN
END;
「テーブルは存在しますか?」という質問に対する答えを本当に知りたい場合は、テーブルをクエリして、結果の SQLSTATE を分析できます。次の関数は、いくつかの機能を利用します。
ON EXCEPTION RESUME は、SELECT によって発生した例外を無視し、制御を IF ステートメントに渡します。
EXECUTE IMMEDIATE を使用すると、テーブル名が文字列変数にあるクエリを記述できます。
TOP 1 は、テーブルに 100 万行が含まれていても、1 行だけが選択されるようにします。
ORDER BY 1 を使用すると、結果セットが順序付けされている場合にのみ TOP を使用できるという要件を満たすことができます。
SELECT 1 を使用すると、列名を指定する負担が軽減されます。
INTO @dummy は、SELECT (したがって、EXECUTE IMMEDIATE) が結果セットを返さないことを意味します。
SELECT が機能する場合、SQLSTATE は成功の場合は '00000' に設定され、行が見つからない場合は '02000' に設定されます。他の SQLSTATE は、テーブルに深刻な問題があることを意味します...テーブルが存在しないように。
CREATE FUNCTION f_table_is_ok
( IN @table_name VARCHAR ( 128 ) )
RETURNS INTEGER
ON EXCEPTION RESUME
BEGIN
DECLARE @dummy INTEGER;
EXECUTE IMMEDIATE STRING (
'SELECT TOP 1 1 INTO @dummy FROM ',
@table_name,
' ORDER BY 1' );
IF SQLSTATE IN ( '00000', '02000' ) THEN
RETURN 1
ELSE
RETURN 0
END IF;
END;
ここにいくつかのテストコードがあります:
BEGIN
DECLARE LOCAL TEMPORARY TABLE tt ( c INTEGER );
DECLARE LOCAL TEMPORARY TABLE "t t" ( c INTEGER );
SELECT f_table_is_ok ( 'asdf' );
SELECT f_table_is_ok ( 'tt' );
SELECT f_table_is_ok ( '"t t"' );
SELECT f_table_is_ok ( '"SYS"."SYSTABLE"' );
END;
とにかくドロップしてエラーを無視してみてください...
BEGIN
DROP TABLE テーブル;
その他の場合の例外
終わり;