Como han dicho otros, las tablas temporales duran hasta que las suelta explícitamente o la sesión finaliza.
Si el procedimiento almacenado falla porque la tabla ya existe, SPL genera una excepción. Puede resolver excepciones agregando una cláusula ON EXCEPTION, pero está ingresando una de las partes más barrocas de SPL, Stored Procedure Language.
Aquí es una versión ligeramente modificada de su procedimiento almacenado - uno que genera una división por cero excepción (SQL -1202):
CREATE PROCEDURE foo()
define i integer;
SELECT * FROM 'informix'.systables INTO TEMP tempTable;
-- do something with tempTable here
let i = 1/0;
DROP TABLE tempTable;
END PROCEDURE;
execute procedure foo();
SQL -1202: An attempt was made to divide by zero.
execute procedure foo();
SQL -958: Temp table temptable already exists in session.
Esto muestra que la primera vez a través del código que se ejecuta la instrucción SELECT, creando la mesa, y luego corrieron falta de la división por cero. La segunda vez, sin embargo, SELECT falló porque la tabla temporal ya existía, de ahí el mensaje de error diferente.
drop procedure foo;
CREATE PROCEDURE foo()
define i integer;
BEGIN
ON EXCEPTION
DROP TABLE tempTable;
SELECT * FROM 'informix'.systables INTO TEMP tempTable;
END EXCEPTION WITH RESUME;
SELECT * FROM 'informix'.systables INTO TEMP tempTable;
END;
-- do something with tempTable here
let i = 1/0;
DROP TABLE tempTable;
END PROCEDURE;
El bloque BEGIN/END limita el manejo de excepciones a la instrucción atrapada. Sin BEGIN/END, el manejo de excepciones cubre todo el procedimiento, reaccionando también a la división por error cero (y por lo tanto, permitiendo que la TABLA DE DESCARGA funcione y el procedimiento parece ejecutarse con éxito).
Tenga en cuenta que todavía TempTable existe en este punto:
+ execute procedure foo();
SQL -1202: An attempt was made to divide by zero.
+ execute procedure foo();
SQL -1202: An attempt was made to divide by zero.
Esto demuestra que el procedimiento ya no falla porque la tabla temporal está presente.
Puede limitar el bloque de excepción ON para códigos de error seleccionados (-958 parece plausible para éste) por:
ON EXCEPTION IN (-958) ...
consulte el manual IBM Informix a SQL: sintaxis manual, capítulo 3 'Declaraciones de SPL' .
Tenga en cuenta que Informix 11.70 añadió el 'SI EXISTE' y 'SI NO EXISTE' cláusulas para crear y Declaraciones DROP. Por lo tanto, es posible utilizar el DROP TABLE declaración modificada:
DROP TABLE IF EXISTS tempTable;
Por lo tanto, con Informix 11.70 o más tarde, la forma más fácil de escribir el procedimiento es:
DROP PROCEDURE IF EXISTS foo;
CREATE PROCEDURE foo()
define i integer;
DROP TABLE IF EXISTS tempTable;
SELECT * FROM 'informix'.systables INTO TEMP tempTable;
-- do something with tempTable here
let i = 1/0;
DROP TABLE tempTable; -- Still a good idea
END PROCEDURE;
También es posible usar esto, pero entonces obtenga la definición previa del procedimiento, sea lo que sea, y puede que no sea lo que esperaba.
CREATE PROCEDURE IF NOT EXISTS foo()
define i integer;
DROP TABLE IF EXISTS tempTable;
SELECT * FROM 'informix'.systables INTO TEMP tempTable;
-- do something with tempTable here
let i = 1/0;
DROP TABLE tempTable; -- Still a good idea
END PROCEDURE;
Lo que tienes aquí - descarta la tabla pero ignora el error si no existe - es una buena forma de hacerlo. En circunstancias normales, la tabla temporal falta tanto antes de ejecutarse como una vez completada. Sería posible ajustar el alcance de la excepción, pero eso debería funcionar bien. –
Tenga en cuenta que Informix moderno admite las cláusulas IF EXISTS y IF NOT EXISTS en sentencias como DROP TABLE. Por lo tanto, en estos días, puede escribir: 'DROP TABLE IF EXISTS tempTable;' que soltará la tabla si está presente (y usted tiene permiso, etc.) y no hará nada si la tabla no existe. –