문제

나는 다음과 같은 절차:

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 인 경우 선택하기 전에 테이블을 삭제하십시오 ... 드롭 테이블과 동일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top