Như những người khác đã nói, các bảng tạm thời kéo dài cho đến khi bạn thả chúng một cách rõ ràng hoặc phiên kết thúc.
Nếu thủ tục được lưu không thành công vì bảng đã tồn tại, SPL tạo ra một ngoại lệ. Bạn có thể xử lý ngoại lệ bằng cách thêm mệnh đề ON EXCEPTION -— nhưng bạn đang nhập một trong các phần baroque của SPL, Ngôn ngữ thủ tục được lưu trữ.
Đây là một phiên bản sửa đổi nhẹ của thủ tục lưu trữ của bạn - một trong đó tạo ra một chia cho số không ngoại lệ (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.
Điều này cho thấy lần đầu tiên thông qua các mã thực thi SELECT, tạo bảng, và sau đó chạy hôi của phân chia bằng không. Lần thứ hai, mặc dù, SELECT thất bại vì bảng temp đã tồn tại, do đó thông báo lỗi khác nhau.
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;
Khối BEGIN/END giới hạn xử lý ngoại lệ cho câu lệnh bị bẫy. Nếu không có BEGIN/END, việc xử lý ngoại lệ bao gồm toàn bộ quy trình, phản ứng với sự phân chia bằng lỗi số 0 (và do đó cho phép DROP TABLE hoạt động và quy trình có vẻ chạy thành công).
Lưu ý rằng temptable vẫn còn tồn tại vào thời điểm này:
+ 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.
Điều này cho thấy các thủ tục không còn thất bại vì bảng tạm thời có mặt.
Bạn có thể giới hạn khối EXCEPTION ON để mã lỗi được lựa chọn (-958 có vẻ hợp lý cho một này) bằng cách:
ON EXCEPTION IN (-958) ...
Xem Informix Hướng dẫn IBM to SQL: Cú pháp sử dụng, chương 3 'Báo cáo SPL' .
Lưu ý rằng Informix 11,70 thêm 'NẾU EXISTS' và 'NẾU KHÔNG EXISTS' khoản để CREATE và Câu lệnh DROP. Vì vậy, bạn có thể sử dụng các biến đổi DROP TABLE tuyên bố:
DROP TABLE IF EXISTS tempTable;
Như vậy, với Informix 11,70 hay muộn, cách dễ nhất để viết các thủ tục là:
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;
Bạn cũng có thể sử dụng điều này, nhưng sau đó bạn có được định nghĩa trước đó của quy trình, bất kể nó là gì, và nó có thể không phải là những gì bạn mong đợi.
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;
Những gì bạn đã có ở đây - thả bảng nhưng bỏ qua lỗi nếu nó không tồn tại - là một cách tốt để đi. Trong hoàn cảnh bình thường, bảng tạm thời bị thiếu cả trước khi nó chạy và sau khi nó hoàn thành. Nó sẽ có thể tinh chỉnh phạm vi của ngoại lệ, nhưng điều đó sẽ hoạt động tốt. –
Lưu ý rằng Informix hiện đại hỗ trợ các mệnh đề IF EXISTS và IF NOT EXISTS trong các câu lệnh như DROP TABLE. Vì vậy, những ngày này, bạn có thể viết: 'DROP TABLE IF EXISTS tempTable;' sẽ thả bảng nếu nó hiện diện (và bạn có quyền, vv) và không làm gì nếu bảng không tồn tại. –