수명의 임시 테이블
-
11-09-2019 - |
문제
나는 다음과 같은 절차:
CREATE PROCEDURE foo ()
SELECT * FROM fooBar INTO TEMP tempTable;
-- do something with tempTable here
DROP TABLE tempTable;
END PROCEDURE;
무슨 일이 있는 경우에는 예외 드롭하기 전에 테이블을까?이 tempTable 여전히 후 foo 되나요?
그렇다면,foo 실패 할 수 있습 다음에 그것은이라고,기 때문에 tempTable 이미 존재한다.그는 어떻게 처리할 수 있습니다.
편집:내가 사용하 informix11.5
해결책 3
나는 마침내 Jonathan 's and Ret의 솔루션의 변형을 사용했습니다.
CREATE PROCEDURE foo ()
ON EXCEPTION IN (-206)
END EXCEPTION WITH RESUME;
DROP TABLE tempTable;
SELECT * FROM fooBar INTO TEMP tempTable;
-- do something with tempTable here
DROP TABLE tempTable;
END PROCEDURE;
다른 팁
된 임시 테이블이 마지막 때까지 당신이 그들을 명시적으로 또는 세션이 끝납니다.
저장 프로시저가 실패할 경우 테이블이 이미 존재,SPL 는 예외를 생성합니다.처리할 수 있습니다 예외를 추가하여 예외에서 절은-하지만 당신은 중 하나를 입력하여 더 많은 바로크 양식의 부분 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.
이는 첫 번째 시간에 코드를 실행 선택,작성 테이블,그리고 도망의 파울을 나눕니다.두 번째는,하지만,선택하지 못했기 때문에 temp 테이블이 이미 존재,따라서 다른 오류 메시지가 표시됩니다.
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;
시작/끝 구획한 제한의 예외 처리를 갇힌 문입니다.지 않고 시작/종료,예외 처리를 다룹 전체의 절차,반응을 나눌에 의해 영 오류가 너무(므로 시켜서 드롭다운 테이블 작업과 절차를 실행하는 것이 성공적으로).
Note 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.
이 절차가 더 이상 없기 때문에 실패 temp 테이블이 존재합니다.
을 제한할 수 있습에는 예외 블록을 선택한 오류 코드(-958 그럴듯한 것이 하나)by:
ON EXCEPTION IN (-958) ...
IBM Informix 가이드 SQL:구문 설명서,제 3 장'SPL 표'.
Note Informix11.70 추가'존재하는 경우에는'그리고'하지 않을 경우 존재'절을 만들고 삭제하는 문입니다.따라서 사용할 수 있습니다 modified 테이블 삭제 책:
DROP TABLE IF EXISTS tempTable;
따라서,Informix11.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;
문서에 따르면, 세션이 종료되면 임시 테이블이 삭제됩니다.
Yes,temp table 것입니다 여전히 존재합니다.Temp 테이블에 의해 정의가 평생의 세션들을 만든지 않는 한 명시적으로 삭제됩니다.
Temp 테이블에서만 볼 수 있습 세션을 만들었는지 그리고 아무런 장애물이 동일한 절차를 실행하여 동시에 여러 사용자.아담의 대답이 테스트의 존재에 대한 임시 테이블을 반환 non-zero 결과는 경우 사용자가 실행하는 절차이다.당신이 필요하 테스트는 세션을 소유하는 임시 테이블은 현재 세션뿐만 아니라.는 이 질문은 범위 내에서 저장되는 절차,그것은 단순할 수 있습니다 추가 명시적,드롭을 감싸에서 몇 가지 예외 처리가 있습니다.
SELECT count(*)
INTO w_count
FROM sysmaster:systabnames s,sysmaster:systabinfo i
WHERE i.ti_partnum = s.partnum
AND sysmaster:BITVAL(i.ti_flags,'0x0020') = 1
AND s.tabname = 'tempTable' ;
w_count가 1 인 경우 선택하기 전에 테이블을 삭제하십시오 ... 드롭 테이블과 동일합니다.