正如其他人所说,临时表会持续存在,直到您明确删除它们或会话结束。
如果存储过程因表已存在而失败,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,创建了表,然后运行了除以零的错误。但是,第二次 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:语法手册,第 3 章“SPL 语句”。
请注意,Informix 11.70 在 CREATE 和 DROP 语句中添加了“IF EXISTS”和“IF NOT EXISTS”子句。因此,您可以使用修改后的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;