Если вы задаете вопрос: «Как удалить локальную временную таблицу, не вызывая ошибки, если она не существует?» тогда ответ прост: просто отбросьте его и проигнорируйте любую ошибку:
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;