正如其他人所说,临时表会持续到您明确删除它们或会话结束。
如果存储过程因表已存在而失败,则 SPL 会生成异常。您可以通过添加一个 ON EXCEPTION 子句来处理异常——但是您正在输入 SPL 中更巴洛克的部分之一,即存储过程语言。
这是您的存储过程的轻微修改版本 - 生成除以零异常 (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.
这表明第一次通过代码执行了 SELECT,创建了表,然后执行了除以零的错误。但是,第二次选择失败,因为临时表已经存在,因此出现了不同的错误消息。
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;
BEGIN/END 块将异常处理限制为捕获语句。如果没有 BEGIN/END,异常处理会覆盖整个过程,也会对除以零错误做出反应(因此让 DROP TABLE 工作并且过程似乎运行成功)。
注意 temptable 此时仍然存在:
+ 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.
这表明该过程不再失败,因为临时表存在。
您可以通过以下方式将 ON EXCEPTION 块限制为选定的错误代码(-958 似乎对此很合理):
ON EXCEPTION IN (-958) ...
请参阅 IBM Informix Guide to SQL: Syntax 手册,第 3 章“SPL 语句”。
请注意,Informix 11.70 将“IF EXISTS”和“IF NOT EXISTS”子句添加到 CREATE 和 DROP 语句中。因此,您可以使用修改后的DROP TABLE语句:
DROP TABLE IF EXISTS tempTable;
因此,对于 Informix 11.70 或更高版本,编写过程的最简单方法是:
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;
您也可以使用它,但随后您将获得该过程的先前定义,无论它是什么,它可能不是您所期望的。
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;