Как проверить, существует ли временная таблица в SQL Anywhere? - PullRequest
3 голосов
/ 06 мая 2009

Я хочу написать оператор SQL IF, который проверяет, существует ли локальная временная таблица, но такие таблицы не записываются в системный каталог SQL Anywhere.

Ответы [ 3 ]

5 голосов
/ 06 мая 2009

Обратите внимание, что вы можете сделать это в 11.0.1 и выше:

DROP TABLE IF EXISTS t;
3 голосов
/ 06 мая 2009

Если вы задаете вопрос: «Как удалить локальную временную таблицу, не вызывая ошибки, если она не существует?» тогда ответ прост: просто отбросьте его и проигнорируйте любую ошибку:

BEGIN
   DROP TABLE t;
   EXCEPTION WHEN OTHERS THEN
END;

Если вам действительно нужно знать ответ на вопрос "Существует ли таблица t?" Вы можете запросить таблицу и проанализировать полученный SQLSTATE. Следующая функция использует несколько функций:

  • ON EXCEPTION RESUME игнорирует любое исключение, вызванное SELECT, и передает управление в оператор IF.

  • EXECUTE IMMEDIATE позволяет написать запрос, в котором имя таблицы находится в строковой переменной.

  • TOP 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; 
1 голос
/ 06 мая 2009

просто попробуйте все равно отбросить и игнорировать ошибку ...

НАЧАТЬ
DROP TABLE стол;
ИСКЛЮЧЕНИЕ, КОГДА ДРУГИЕ ТОГДА

END;

...