Я хочу написать оператор SQL IF, который проверяет, существует ли локальная временная таблица, но такие таблицы не записываются в системный каталог SQL Anywhere.
Как проверить, существует ли временная таблица в SQL Anywhere?
Ответы (3)
Обратите внимание, что вы можете сделать это в 11.0.1 и выше:
DROP TABLE IF EXISTS t;
Если вы задаетесь вопросом: «Как мне удалить локальную временную таблицу, не вызывая ошибки, если она не существует?» тогда ответ прост: просто УДАЛИТЕ его и игнорируйте любую ошибку:
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;
просто попробуйте удалить его в любом случае и игнорировать ошибку...
BEGIN
DROP TABLE table;
ИСКЛЮЧЕНИЕ, КОГДА ДРУГИЕ, ТОГДА
КОНЕЦ;