2017-12-14 1 views
0

프로 시저가 끝날 때 값을 설정하려고하면 정의되지 않은 이름으로 OUT 매개 변수 ID에 대해 오류가 발생합니다. 그것을 주석 처리하면 절차가 잘 실행됩니다. 내가 뭘 잘못하고 있니?OUT 매개 변수 DB2 저장 프로 시저

CREATE PROCEDURE P3.CUST_CRT(IN NAME VARCHAR(15), 
          IN GENDER CHAR(1), 
          IN AGE INTEGER, 
          IN PIN INTEGER, 
          OUT ID INTEGER) 
LANGUAGE SQL 
P1: BEGIN 
     --Check if Customer NAME is NULL. 
     IF NAME IS NULL THEN 
       SIGNAL SQLSTATE VALUE '20010' 
       SET MESSAGE_TEXT = 'No NAME.'; 
     END IF; 
     --Check if Customer NAME is an empty string. 
     IF NAME = '' THEN 
       SIGNAL SQLSTATE VALUE '20020' 
       SET MESSAGE_TEXT = 'NAME cannot be an empty string.'; 
     END IF; 
     --Check if Customer GENDER falls in either of the two acceptable categories. 
     IF GENDER NOT IN ('M','F') THEN 
       SIGNAL SQLSTATE VALUE '20030' 
       SET MESSAGE_TEXT = 'GENDER can either be M or F'; 
     END IF; 
     --Check if Customer AGE is not null. 
     IF AGE IS NULL THEN 
       SIGNAL SQLSTATE VALUE '20040' 
       SET MESSAGE_TEXT = 'AGE cannot be NULL'; 
     END IF; 
     --Check that AGE is not negative. 
     IF AGE < 0 THEN 
       SIGNAL SQLSTATE VALUE '20060' 
       SET MESSAGE_TEXT = 'AGE cannot be negative.'; 
     END IF; 
     --Check that the Customer is an adult. 
     IF AGE < 18 THEN 
       SIGNAL SQLSTATE VALUE '20070' 
       SET MESSAGE_TEXT = 'You have to be over 18 years to have an account.'; 
     END IF; 
     --Check that PIN is not null. 
     IF PIN IS NULL THEN 
       SIGNAL SQLSTATE VALUE '20080' 
       SET MESSAGE_TEXT = 'PIN cannot be empty.'; 
     END IF; 
     --Pin cannot be less than zero. 
     IF PIN < 0 THEN 
       SIGNAL SQLSTATE VALUE '20090' 
       SET MESSAGE_TEXT = 'PIN cannot be less than 0.'; 
     END IF; 

     INSERT INTO P3.CUSTOMER(Name, Gender, Age, Pin) VALUES(NAME, GENDER, AGE, P3.ENCRYPT(PIN)); 
     SET ID = ID.CURRVAL; 
END P1 @ 

답변

1

항상 도움을 청할 때 Db2 Server 버전과 운영 체제를 지정하십시오. 정확한 오류 메시지와 오류 코드를 지정하지 않으면 "오류 발생"이라고 쓰지 마십시오. 코드에서는 "ID"라는 이름의 시퀀스 객체가 스키마에 있다고 가정하고 출력 매개 변수 이름을 시퀀스 이름과 같게해서는 안됩니다. 시퀀스 개체에 출력 매개 변수와 다른 이름을 지정하십시오.

"코드 : -204, SQL 상태 : 42704"의 경우 "DB2ADMIN.ID"는 정의되지 않은 이름입니다. SQLCODE = -204, SQLSTATE = 42704, DRIVER = 4.22 .29 "에서 Db2는 출력 매개 변수 (ID라는)가 시퀀스 객체와 이름이 같고 Db2가 DB2ADMIN이라는 스키마에서 시퀀스 객체를 찾을 수 없다는 것을 알려줍니다. 즉, 데이터베이스에 연결하는 스키마입니다 컴파일하기.

따라서 시퀀스 개체 이름을 한정하십시오 (예 : P3.ID (예 : 시퀀스 정규화 된 이름 인 경우)) 또는 시퀀스 개체의 올바른 전체 이름을 지정하십시오.

시퀀스의 다음 값을 사용하는 코드가 명확하지 않지만 (현재 값만 사용함), 코드와는 별도로 문제가됩니다. -204 - 다른 말로하면 다른 오류가있을 수 있습니다.

가장 최근에 사용한 시퀀스 값을 반환하려는 경우 한 가지 방법 (더 우아한 방법을 포함하여 다른 방법이 있음) 수행에 (이 예에서는, 시퀀스 객체 P3.THEID으로 미리 생성)과 같은 경우 : CURRVAL 함수를 사용하기 위해 그것을 정의 할 수있는 동안

INSERT INTO P3.CUSTOMER(ID, Name, Gender, Age, Pin) VALUES(NEXT VALUE FOR P3.THEID , NAME, GENDER, AGE, P3.ENCRYPT(PIN)); 

SET ID = P3.THEID.CURRVAL; 
+0

Windows 8.1 시스템에서 db2 express c 32 비트를 사용하고 있습니다. DB2ADMIN은 기본 스키마의 이름입니다. 코드를 실행중인 스키마는 P3입니다. 이것은 내가 받고있는 오류입니다 : [Code : -204, SQL State : 42704] "DB2ADMIN.ID"는 정의되지 않은 이름입니다. SQLCODE = -204, SQLSTATE = 42704, DRIVER = 4.22.29. – TheMokuaBrand

+0

이쪽으로? ID P3.ID.CURRVAL을 P3.CUSTOMER에서 ID로 선택하십시오. 불행히도 여전히 DB2ADMIN.ID 대신 P3.ID와 동일한 오류가 발생합니다. 명시 적으로 INSERT에서 시퀀스를 사용하지 않는다는 사실이 문제가 될 수 있습니까? 난 그냥 프로 시저가 마지막 삽입의 기본 키 (ID)를 반환 싶어요. – TheMokuaBrand

1

내 ID 변수는 정수로 정의된다 SEQUENCE 개체로.

+0

예 시퀀스가 ​​문제였습니다. @ 마오의 대답에서 나는 그것을 문제로 확인할 수있었습니다. – TheMokuaBrand

관련 문제