DECLARE VECTOR

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));
ROW にはベクトルを含めることもでき、ROW 内のフィールドには、次のようにドット表記を使用してアクセスできます。
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];
ベクトル インデックスは数値に評価される必要があります。そうしないと、次の例のようにエラーが発生します。
SET yourvector[1 || 'text'] = ‘text’;
ベクトル インデックスが NULL に評価される場合、エレメント参照は NULL になります。
ターゲット参照インデックスが NULL の場合、次の例のようにエラーが発生します。
SET vectorX[NULL] = 'text';
ベクトルは現在の割り当てによってバインドされますが、再割り当てまたはシステム プロシージャによってサイズを変更できます。
ベクトルは、暗黙的に割り当て可能なデータ タイプを持つ他のベクトルに割り当てることができます。データ タイプが同じでない場合、ベクターが作成され、すべてのエレメントで自動的に CAST 関数が実行され、値がターゲット型に変換されます。

ベクトルの比較

基本タイプが同等であれば、ベクトルを相互に比較できます。 =(等しい)や!=(等しくない)などの比較演算子のみがサポートされています。

同じ数の値があり、対応するエレメントが等しい場合、ベクトルは等しくなります。いずれかのベクトルがNULLの場合、比較の結果は不明です。エレメントのいずれかがNULLの場合、比較の結果は不明です。

ベクトルと関数

ベクトルの内容を変更するために、いくつかの関数を使用できます。次の関数がサポートされています:CARDINALITY、CAST、CONCAT、EXTEND、およびTRUNCATE。基本データ型に関係なく、すべてのベクトルはこれらの関数の引数として受け入れられます。

CARDINALITY

この関数は、ベクトルに割り当てられたエレメントの数を返します。

CAST

この関数は、ベクトル内のすべてのエレメントを目的のターゲット データ タイプに変換します。結果ベクトルは、ソース ベクトルと同じサイズです。ベクトルに NULL エレメントがある場合、結果ベクトルには NULL が含まれます。ソース ベクトルのデータ タイプとターゲット ベクトルのデータ タイプは互換性がなければなりません。詳細については、セクション CASTを参照してください。

CONCAT

この関数は、同じデータ型を持つ2つのベクトルを一緒に追加します。ベクトルのいずれかがNULLの場合、結果のベクトルがNULLであることを示すエラーが発生します。 NULL以外のベクトルを連結すると、連結されたベクトルのエレメントを含む新しいベクトルになります。入力ベクトルのエレメントは連続して追加されます。つまり、最初のベクトルのエレメントが最初に結果ベクトルに入力され、次に2番目のベクトルのエレメントが結果ベクトルに入力されます。

注: ||演算子はCONCAT関数と同じことを行います。

EXTEND

この関数は、指定された数のエレメントをベクトルに追加します。追加されたエレメントの数には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);   

TRUNCATE

この関数は、指定された数のエレメント (「チョップカウント」) をベクトルの末尾から削除します。構文は次のとおりです。

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