3

ローカル一時テーブルが存在するかどうかをチェックする SQL IF 文を書きたいのですが、そのようなテーブルは SQL Anywhere システム カタログに記録されていません。

4

3 に答える 3

5

これは 11.0.1 以降で実行できることに注意してください。

DROP TABLE IF EXISTS t;
于 2009-05-06T15:01:00.327 に答える
3

「ローカル一時テーブルが存在しない場合、エラーを発生させずに削除するにはどうすればよいですか?」という質問をしている場合は、答えは簡単です:それをドロップしてエラーを無視してください:

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; 
于 2009-05-06T12:45:08.250 に答える
1

とにかくドロップしてエラーを無視してみてください...

BEGIN
DROP TABLE テーブル;
その他の場合の例外

終わり;

于 2009-05-06T12:45:05.753 に答える