リファレンスガイド> TDV SQLスクリプト> SQLスクリプトステートメントリファレンス> DECLARE VECTOR
 
<g1>DECLARE VECTOR</g1>
SQLスクリプトのDECLAREVECTORは、展開可能、順序付け、および型指定されたコレクションデータタイプを宣言します。ベクトルには、初期化時にデータタイプが必要です。
このセクションでは、VECTORを宣言するための一般的な構文を示し、SQLスクリプトでのベクトルの機能について説明します。セクションの最後に例を示します。
構文
DECLARE <identifier> VECTOR (<data type>) [DEFAULT VECTOR [<value>, <value>]]
基本データタイプ
DEFAULT句はオプションであり、VECTOR値を初期化するために使用できます。
ベクトルを別のベクトルの基本データタイプにすることはできないため、次の宣言を使用することはできません。
DECLARE vectorX VECTOR (VECTOR (CHAR)));
 
ROWは、ベクトルの許容可能な基本データタイプであり、次の例のように、コレクションの実装に必要です。
DECLARE vectorX VECTOR(ROW (a INTEGER,
b INTEGER, c CHAR, d CHAR));
 
行にはベクトルを含めることもでき、行のフィールドには次のようにドット表記でアクセスできます。
DECLARE myRow ROW(a INTEGER, v VECTOR(INTEGER));
SET myRow = ROW(1, VECTOR[9,10,11]);
SET myRow.v[2] = 9;
 
DECLARE vecRow VECTOR(ROW (a INTEGER, b CHAR));
SET vecRow = VECTOR[(22, 'text')];
SET vecRow[1].a = vecRow[1].a + 15;
宣言
ベクトルをCURSORまたはPIPEのフィールドとして宣言することはできないため、次の宣言は許可されません。
DECLARE myCursor CURSOR (a VECTOR(CHAR));
 
ベクトルは、PUBLIC定数または非公開定数として宣言できます。このようなベクトルの内容は変更しないでください。
CONSTANT VECTORの最初の内容は、DEFAULT句で定義する必要があり、リテラルまたは他の同様のタイプのベクトルへの参照である必要があります。
VECTORエレメントへの値の割り当て
式によって、基本型のない空のベクトルを作成できます。
VECTOR[]
 
ベクトル内のエレメントにNULLの値を割り当てることができます。
SET vectorX[1] = NULL;
 
次の例のように、ベクトルは宣言時にNULLに設定され、使用する前に初期化する必要があります。初期化されていないベクトルを参照すると、エラーが発生します。
VECTOR['my text', 'your text']
 
この式は、次のように、SETステートメントを使用して互換性のあるベクトルに割り当てることができます。
SET my_vector = VECTOR['my text', 'your text'];
SET your_vector = VECTOR[ROW(2,3), ROW(4,5)];
SET your_vector = my_vector;
 
上記の宣言では、ソースベクトルyour_vectorの内容がターゲットベクトルmy_vectorにコピーされ、ターゲットベクトルが初期化されます。
ベクトルはプロシージャのパラメータとして使用でき、OUTまたはINOUTパラメータを使用するプロシージャは、SETステートメントと同じ方法でベクトルを変更できます。
CALL myProcedure(vectorX);
 
ベクトルを初期化してスペースをベクトルに割り当てた後、他のプログラミング言語の配列と同様に、ベクトル内のエレメントに角かっこでアクセスできます。ベクトルインデックスは1から始まり、1ずつ増加します。
SET vectorX[20] = 'my text';
SET yourvector[2 + index] = vectorX[20];
A vector index must evaluate to a numeric value. Otherwise, an error results, as in the following example:
SET yourvector[1 || 'text'] = ‘text’;
 
ベクトルインデックスがNULLと評価された場合、エレメント参照はNULLになります。
ターゲット参照インデックスがNULLの場合、次の例のようにエラーが発生します。
SET vectorX[NULL] = 'text';
 
ベクトルは現在の割り当てによってバインドされますが、再割り当てまたはシステム手順によってサイズを変更できます。
ベクトルは、暗黙的に割り当て可能なデータタイプを持つ他のベクトルに割り当てることができます。データタイプが同じでない場合は、ベクトルが作成され、すべてのエレメントで自動的にCAST関数が実行され、値がターゲット型に変換されます。
ベクトルの比較
基本タイプが同等であれば、ベクトルを相互に比較できます。 =(等しい)や!=(等しくない)などの比較演算子のみがサポートされています。
同じ数の値があり、対応するエレメントが等しい場合、ベクトルは等しくなります。いずれかのベクトルがNULLの場合、比較の結果は不明です。エレメントのいずれかがNULLの場合、比較の結果は不明です。
ベクトルと関数
ベクトルの内容を変更するために、いくつかの関数を使用できます。次の関数がサポートされています:CARDINALITY、CAST、CONCAT、EXTEND、およびTRUNCATE。基本データタイプに関係なく、すべてのベクトルはこれらの関数の引数として受け入れられます。
カーディナリティ
この関数は、ベクトルに割り当てられたエレメントの数を返します。
キャスト
この関数は、ベクトル内のすべてのエレメントを目的のターゲットデータタイプに変換します。結果のベクトルは、ソースベクトルと同じサイズです。ベクトルにNULLエレメントがある場合、結果のベクトルにはNULLが含まれます。ソースベクターのデータタイプとターゲットベクターのデータタイプは互換性がある必要があります。詳細については、CASTのセクションを参照してください。
CONCAT
この関数は、同じデータタイプを持つ2つのベクトルを一緒に追加します。ベクトルのいずれかがNULLの場合、結果のベクトルがNULLであることを示すエラーが発生します。 NULL以外のベクトルを連結すると、連結されたベクトルのエレメントを含む新しいベクトルになります。入力ベクトルのエレメントは連続して追加されます。つまり、最初のベクトルのエレメントが最初に結果ベクトルに入力され、次に2番目のベクトルのエレメントが結果ベクトルに入力されます。
注: ||演算子はCONCAT関数と同じことを行います。
拡張する
この関数は、指定された数のエレメントをベクトルに追加します。追加されたエレメントの数にはNULL値が割り当てられ、構文は次のとおりです。
SET vectorX = EXTEND (vectorX, 2);
 
追加するように指定されたエレメントの数がNULLと評価された場合、この関数はNULLを返します。
ベクトルがNULLの場合、エラーが発生し、ベクトルがNULLであることを示します。
指定した数値が負の数の場合、エラーが発生します。
FIND_INDEX
この関数は、指定された値が最初に出現するベクトルを検索します。 2つの引数を受け入れます。最初の引数は任意のスカラー値です。 2番目の引数は、検索されるベクトルです。インデックスは1から始まります。
ベクトルの基本型と指定された引数のデータタイプは、比較可能であるか、暗黙的にキャスト可能である必要があります。
検索された値がベクトルに見つからない場合、結果はゼロになります。
ベクトルまたは指定された引数のいずれかがNULLの場合、関数の結果はNULLになります。
次の例では、値3が返されます。
DECLARE v VECTOR(INT) DEFAULT VECTOR [5, 10, 50, 100];
SET i = FIND_INDEX(50, v);
 
切り捨てる
この関数は、指定された数のエレメント(「チョップカウント」)をベクトルの末尾から削除します。構文は次のとおりです。
SET vector1 = TRUNCATE (vector1, chop_count)
 
チョップカウントがNULLと評価された場合、この関数はNULLを返します。
チョップカウントが負の場合、またはベクトルの初期サイズを超える場合、エラーが発生します。
ベクトルがNULLの場合、エラーが発生します。
TRUNCATEは、TDVでサポートされているSQL関数でもあります。説明については、TRUNCATEを参照してください。
このセクションには、SQLスクリプトのベクトルの機能を説明するためのいくつかの例が含まれています。
PROCEDURE vectorExampleA()
BEGIN
DECLARE vectorX VECTOR(ROW(a int, b char));
DECLARE vectorY VECTOR(ROW(x int, y char));
 
SET vectorX = VECTOR[(11, 'one in vectorX'), (12, 'two in vectorX')];
SET vectorY = VECTOR[(21, 'one in vectorY'), (22, 'two in vectorY')];
CALL print(vectorX[1].b);
CALL print(vectorX[2].b);
IF vectorX != vectorY THEN
  CALL print(vectorY[1].y);
END IF;
END
 
PROCEDURE vectorExampleB()
BEGIN
DECLARE vectorX VECTOR(ROW(a int, b char));
DECLARE vectorY VECTOR(ROW(x int, y char));
 
SET vectorX = VECTOR[(11, 'one in vectorX'), (12, 'two in vectorX')];
SET vectorX[1].a = vectorX[1].a + 11;
SET vectorY = VECTOR[(5, 'one in vectorY'), (10, 'two in vectorY')];
SET vectorX = vectorY;
CALL PRINT(TO_CHAR(vectorX[2].a));
END
 
PROCEDURE vectorExampleC(OUT x VECTOR(INTEGER))
BEGIN
DECLARE vectorX VECTOR(INTEGER);
 
SET x = VECTOR[5, 55, 60];
SET vectorX = x;
CALL PRINT(TO_CHAR(x[1]));
END
 
PROCEDURE vectorExampleD()
BEGIN
DECLARE vConstM CONSTANT VECTOR(INTEGER)
DEFAULT VECTOR[1, 2];
DECLARE vConstN CONSTANT VECTOR(INTEGER)
DEFAULT VECTOR[99, vConstM[2]]
DECLARE x INTEGER;
DECLARE y INTEGER;
 
SET x = vConstM[1];
SET y = vConstN[1];
CALL PRINT(TO_CHAR(x));
CALL PRINT(TO_CHAR(y));
END
 
PROCEDURE vectorExampleE()
BEGIN
DECLARE PUBLIC vConstM CONSTANT VECTOR(INTEGER)
DEFAULT VECTOR[1, 2];
DECLARE PUBLIC vConstN CONSTANT VECTOR(INTEGER)
DEFAULT VECTOR[99, vConstM[2]];
DECLARE x INTEGER;
SET x = vConstN[2];
CALL PRINT(TO_CHAR(x));
END
 
PROCEDURE vectorExampleF(OUT Name VECTOR(CHAR(255)))
BEGIN
DECLARE firstName VECTOR(CHAR);
DECLARE lastName VECTOR(CHAR);
 
SET firstName = VECTOR['john'];
SET lastName = VECTOR['doe'];
SET Name = CONCAT(firstName, lastName);
END
 
PROCEDURE vectorExampleG(OUT card INTEGER)
BEGIN
DECLARE vectorX VECTOR(INTEGER);
 
SET vectorX = VECTOR[5, 55, 19, 15, 23];
SET card = CARDINALITY (vectorX);
END
 
PROCEDURE vectorExampleH(OUT ext VECTOR(INTEGER))
BEGIN
DECLARE vectorX VECTOR(INTEGER);
DECLARE NEWVECTOR VECTOR(INTEGER);
 
SET vectorX = VECTOR[5, 55, 19, 15, 23];
SET vectorX = EXTEND(vectorX, 2);
SET ext = vectorX;
END
 
PROCEDURE vectorExampleJ(OUT ext VECTOR(INTEGER))
BEGIN
DECLARE vectorX VECTOR(INTEGER);
 
SET vectorX = VECTOR[5, 55, 19, 15, 23];
SET vectorX = VECTOR[NULL];
SET vectorX = EXTEND(vectorX, 2);
SET ext = vectorX;
END
 
PROCEDURE vectorExampleK(OUT trunc VECTOR(INTEGER))
BEGIN
DECLARE vectorX VECTOR(INTEGER);
DECLARE newvector VECTOR(INTEGER);
 
SET vectorX = VECTOR[5, 55, 19, 15, 23];
SET newvector = TRUNCATE(vectorX, 2);
SET trunc = newvector;
END
 
PROCEDURE vectorExampleM(OUT trunc VECTOR(INTEGER))
BEGIN
DECLARE vectorX VECTOR(INTEGER);
DECLARE newvector VECTOR(INTEGER);
SET vectorX = VECTOR[5, 25, 30];
SET newvector = TRUNCATE(vectorX, NULL);
SET trunc = newvector;
END