2014-10-14 4 views
0

현재 저장 프로 시저를 실험하고 있으며 간단한 IF/ELSE 문을 구현하려고합니다. DB2를 사용하고 있는데 프로 시저 매개 변수가 null이고 매개 변수가 null이 아니면 모든 레코드를 선택하려고합니다. 데이터베이스를 쿼리합니다.DB2 저장 프로 시저 IF 문

DROP PROCEDURE [email protected] 
CREATE PROCEDURE LWILSON.IFQUERY 
(
    IN p_type VARCHAR(15) 
) 

DYNAMIC RESULT SETS 1 
LANGUAGE SQL 
BEGIN 
DECLARE c_result CURSOR WITH RETURN FOR 
IF p_type IS NULL 
THEN 
SELECT * FROM LWILSON."ANIMALS"; 
OPEN c_result; 
ELSE 
SELECT ID,TYPE,NAME,WEIGHT, AGE FROM LWILSON."ANIMALS" AS ANIMALRESULTS WHERE ANIMALRESULTS.type = p_type; 
OPEN c_result; 
END IF; 
[email protected] 

(I 명령 분리기에 대한 @ 기호를 사용하고 있습니다) 다음과 같이

내 저장 프로 시저 코드입니다. 절차를 실행하려고 할 때 표시되는 오류 메시지는 다음과 같습니다. Error message

도움을 주시면 감사하겠습니다. 감사.

+0

커서 정의와 함께 'if.. else'를 사용할 수 있다고 생각하지 마십시오. – Rahul

+0

두 개의 커서를 선언하고 하나 또는 다른 커서를 열어야합니다. – mustaccio

+0

나는 명시된 것 아래에 다른 커서를 선언했다. 그런 다음 각각의 커서를 열었고 여전히 작동하지 않습니다. 다른 제안? 감사. – LiamWilson94

답변

1

실행할 명령문을 준비하면됩니다. 이 경우 두 개의 커서가 필요하지 않습니다.

CREATE OR REPLACE PROCEDURE LWILSON.IFQUERY (
    IN p_type VARCHAR(15) 
) 
    DYNAMIC RESULT SETS 1 
    LANGUAGE SQL 
BEGIN 
    DECLARE STMT VARCHAR(120); 
    DECLARE c_result CURSOR 
    WITH RETURN FOR RES_SET; 

    IF (p_type IS NULL) THEN 
    SET STMT = "SELECT * FROM LWILSON.ANIMALS"; 
    ELSE 
    SET STMT = "SELECT ID, TYPE, NAME, WEIGHT, AGE " 
    || "FROM LWILSON.ANIMALS AS ANIMALRESULTS " 
    || "WHERE ANIMALRESULTS.type = " || p_type; 
    END IF; 
    PREPARE RES_SET FROM STMT 
    OPEN c_result; 
[email protected] 
+0

감사합니다.이 말이 더 합리적인 것 같습니다. 그러나 다음 오류가 발생합니다. DB2 SQL 오류 : SQLCODE = -104, SQLSTATE = 42601, SQLERRMC = p_type, ON.IF.QUERY (IN; ,, DRIVER = 3.57.110 – LiamWilson94

+0

수정 사항이 입력 할 매개 변수 주위에 이스케이프 문자를 추가하는 중 ... DB2에서 문자열 내에서 작은 따옴표를 사용하려면 큰 따옴표를 사용해야합니다. '' – LiamWilson94

+0

DB2 버전을 지정하지 않았습니다. LUW 용 DB2는 버전 9.7부터 지원합니다 : http://www-01.ibm.com/support/ knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0008329.html? cp = SSEPGG_10.5.0 % 2F2-12-7-90 – AngocA