2016-06-14 2 views
1

함수 내에 배열을 선언 할 수 없습니다. 아래 오류를 보여줍니다. 내 코드는 다음과 같습니다db2 iseries에서 함수 내의 ARRAY 선언 7.1

Error: [SQ20441] Array type not valid where specified.

,

CREATE TYPE REV_QTY AS INTEGER ARRAY[] ;--ALLOW_ARRAY_VALUE_CHANGES 
CREATE OR REPLACE FUNCTION GET_REV_QTY (IN_IPID INTEGER,QTY_TO_PLACE 
    INTEGER,INITIAL_REV_QTY INTEGER) 
RETURNS INTEGER 
LANGUAGE SQL 
DETERMINISTIC 
MODIFIES SQL DATA 

--CONTAINS SQL 
--RETURNS NULL ON NULL INPUT 
NO EXTERNAL ACTION 
BEGIN 

DECLARE AVAILABLE_REV_QTY REV_QTY; 
if exists(AVAILABLE_REV_QTY[IN_IPID]) then 
CASE WHEN QTY_TO_PLACE > AVAILABLE_REV_QTY[IN_IPID] THEN 
    SET AVAILABLE_REV_QTY[IN_IPID] = 0 
WHEN QTY_TO_PLACE < AVAILABLE_REV_QTY[IN_IPID] AND QTY_TO_PLACE >= 0  
THEN 
    SET AVAILABLE_REV_QTY[IN_IPID] = AVAILABLE_REV_QTY[IN_IPID] - 
QTY_TO_PLACE 
END; 
    END IF; 
RETURN AVAILABLE_REV_QTY[IN_IPID] ; 
END | 

날이에 도와주세요. 저는 DB2 i7.1을 처음 사용하고있어서 이 잘못되었다는 것을 이해할 수 없습니다.

+0

설명서에 SQ20441에 대한 설명이 있습니까? – mustaccio

+0

예. 배열 타입은 다음과 같이 쓰여집니다 : 1. SQL 스칼라 함수 또는 SQL 또는 JAVA 프로 시저로서의 인수로서. 2. SQL 프로시 저나 SQL 스. 라 함수로 선언 된 SQL 변수의 경우. 3. SQL 프로시 저나 SQL 스. 라 함수의 CAST 스펙. 루틴이 호출 될 때 사용되는 배열 유형의 데이터 유형은 루틴이 작성 될 때 사용 된 배열 유형과 일치해야합니다. –

+0

잘못된 설명서를보고있는 것 같습니다. – mustaccio

답변

0

해당 sqlcode = -20441에 대한 IBM i 7.1 문서에는 으로 \가 포함되어 있지 않습니다. 여기에는 어레이 유형 지정 [인수 또는 선언 된 변수로 사용할 수 없음]이 포함됩니다. 참조 : 잡담으로

Listing of SQL messages These tables list SQL messages. Use these tables to find message text, cause text, recovery text, and corresponding SQLCODEs and SQLSTATEs.

SQ20441
Message Text: Array type not valid where specified.
Cause Text: An array type was used but is not allowed in the specified context. Array types can only be used:

• As an argument of an SQL or JAVA procedure.
• For an SQL variable declared in an SQL procedure.
• In a CAST specification in an SQL procedure.

Recovery Text: Remove the reference to the array type. Try the request again.
SQLCODE or SQLCODEs: -20441
SQLSTATE or SQLSTATEs: 428H2

, 참조가 허용 된 코드 인 경우 다음이 영업 이익에 작성된 술어 구문을 사용할 수 없습니다 EXISTS •
; 아마도 다음과 같은 조건이 요구되는 : CASETHEN에 문 후 필요한 세미콜론 •
if cardinality(AVAILABLE_REV_QTY) >= IN_IPID then

INITIAL_REV_QTY INTEGER 누락하는 것은 DECLARE AVAILABLE_REV_QTY REV_QTY ;
배열 값이 첫번째가 아니면 너무도 CARDINALITY 아무 소용이 DEFAULT NULL을 가지고 참조되지 않은 것입니다 구성된; 아마도 인수로 전달 된

참고 : 루틴의 작업은 SQL PROCEDURE으로 구성 될 수 있으며 배열 작업을 수행하기 위해 저장 프로 시저를 호출하도록 다시 작성 될 수 있습니다. 배열에서 오는 것은 OP에서 분명하지 않습니다.