2016-06-14 3 views
1

関数内に配列を宣言できません。以下のエラーが表示されます。db2 iseries 7.1の関数内の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

はい。 Array型は次のように使用します: 1. SQLスカラー関数またはSQLまたはJAVAプロシージャーの引数として。 2. SQLプロシージャーまたはSQLスカラー関数で宣言されたSQL変数の場合。 3. SQLプロシージャーまたはSQLスカラー関数のCAST指定。 ルーチンが呼び出されたときに使用される配列タイプのデータ型は、ルーチンの作成時に使用された配列のデータ の型と一致しなければなりません。 –

+0

あなたは間違ったマニュアルを見ていると思います。 – mustaccio

答えて

0

そのsqlcode = -20441のIBM i 7.1のマニュアルでは、という名前のSQLスカラー関数が含まれていません。ここで、は、配列型の指定を[引数も宣言されていない変数としても]作成できます。参照:asidesとして

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

、参照が許可されたコードだった場合:OPに書かれた述語構文を許可されていない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として構成することができます。おそらく、FUNCTIONも、配列作業を実行するためにストアドプロシージャを呼び出すように書き直すことができます。配列のために来るOPから明らかではない。

関連する問題