Как проверить, существует ли временная таблица в SQL Anywhere?

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


person Breck Carter    schedule 06.05.2009    source источник


Ответы (3)


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

DROP TABLE IF EXISTS t;
person Philbert    schedule 06.05.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; 
person Breck Carter    schedule 06.05.2009

просто попробуйте удалить его в любом случае и игнорировать ошибку...

BEGIN
DROP TABLE table;
ИСКЛЮЧЕНИЕ, КОГДА ДРУГИЕ, ТОГДА

КОНЕЦ;

person Christopher Klein    schedule 06.05.2009