バインド変数の宣言および設定

ttIsqlで、SQL文、SQLスクリプトまたはPL/SQLブロックから参照可能な変数および配列を宣言および構成できます。

variableおよびsetvariableコマンドを使用して宣言した変数は、NUMBERCHARNCHARVARCHAR2NVARCHAR2CLOBNCLOBBLOBREFCURSORのデータ型の1つである必要があります。ただし、配列のバインド時には、TimesTenでは、NUMBERCHARNCHARVARCHAR2またはNVARCHAR2データ型の配列のバインドのみがサポートされています。

ノート:

宣言したすべての変数は、ttIsqlのセッションの間存続します。ただし、同じ名前の新しい変数を宣言すると、新しい変数が古い変数に置き換えられます。

variableまたはvarコマンドのヘルプの使用方法を確認するには:
Command> help var;
Arguments in <> are required.
Arguments in [] are optional.

Command Usage: variable [<VariableName> [<DataType>] [:= <Value>]]
Command Aliases: var
Description: Declares a bind variable that can be referenced in a statement, or
displays the definition of the variable if the type is missing. The type can
be one of the following: (n), NUMBER, CHAR(n), NCHAR(n), VARCHAR2(n) , NVARCHAR2(n), BLOB, CLOB, NCLOB, or REFCURSOR. If only '(n)' is supplied, it
is assumed to be VARCHAR2 (n).

The syntax for binding multiple values to an array using the variable command
is as follows: variable ArrayName '[' ArraySize ']' DataType(n) := '[' Value1,... ValueX ']'

Requires an active connection: NO

Requires autocommit turned off: NO

Reports elapsed execution time: NO

Works only with a TimesTen data source: NO

Example: variable; -or- variable a varchar2(30); -or- var arr[5] number := [ 1, 2, 3 ];
宣言するには、変数の値を設定し、その値を出力します:

Command> var a varchar2(100); #declare variable a

Command> var b varchar2(100) := 'This is B'; #declare variable b and assign value to it

Command> var;  #display available variables

variable   A

datatype   VARCHAR2(100)

variable   B

datatype   VARCHAR2(100)

Command> print a; #print the value of variable a


A            : <NULL>

Command> print; #print values of all available variables

A            : <NULL>

B            : This is B

次の例では、数値、文字列、配列のバインド変数をvariableまたはvarコマンドで宣言しています。それぞれは、宣言時またはsetvariableまたはsetvarコマンドを使用して、値に割り当てられます。

Command> VARIABLE house_number NUMBER := 268; #declare variable house_number and assign the value
Command> PRINT house_number;  #print the value of house_number variable
HOUSE_NUMBER            : 268

Command> VARIABLE street_name VARCHAR2(15); #declare variable street_name
Command> SETVARIABLE street_name := 'Oracle Parkway'; #set the value of the variable street_name
Command> PRINT street_name;
STREET_NAME      :   Oracle Parkway

Command> VARIABLE occupants[5] VARCHAR2(15);  #declare an array variable
Command> SETVARIABLE occupants[1] := 'Pat'; #set the value at the first position of the array
Command> SETVARIABLE occupants[2] := 'Terry'; #set the value at the second position of the array
Command> PRINT occupants;  #print the array
OCCUPANTS            : ARRAY [ 5 ] (Current Size 2)
OCCUPANTS[1] : Pat
OCCUPANTS[2] : Terry

次に、配列に複数の値をバインドする例を示します(大カッコは値の記述用に使用し、カンマは配列内の各値を区切るために使用します)。

Command> VARIABLE occupants[5] VARCHAR2(15) := ['Pat', 'Terry']; #declare an array variable with values
Command> PRINT occupants; #print an array
OCCUPANTS : ARRAY [ 5 ] (Current Size 2)
OCCUPANTS[1] : Pat
OCCUPANTS[2] : Terry

バインド配列を使用する場合、PL/SQLでは、次の宣言で各変数をPL/SQL変数にバインドできます(ここで、TypeNameはPL/SQLデータ型を一意に識別し、DataTypeには、CHARNCHARVARCHAR2またはNVARCHAR2を指定できます)。

TYPE TypeName IS TABLE OF DataType(<precision>) INDEX BY BINARY_INTEGER;

変数がNUMBERの配列として宣言された場合、NUMBERINTEGERFLOATまたはDOUBLE PRECISIONのデータ型のPL/SQL変数にバインドできます。これを行うには、次の適切な宣言を行います。

TYPE TypeName IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
TYPE TypeName IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
TYPE TypeName IS TABLE OF FLOAT INDEX BY BINARY_INTEGER;
TYPE TypeName IS TABLE OF DOUBLE PRECISION INDEX BY BINARY_INTEGER;

次の例は、その後PL/SQLブロックで宣言され使用されるoccupants VARCHAR2配列を宣言します。

Command> VARIABLE occupants[5] VARCHAR2(15);
Command> SETVARIABLE occupants[1] := 'Pat';
Command> SETVARIABLE occupants[2] := 'Terry';
Command> DECLARE
TYPE occuname IS TABLE OF VARCHAR2(15) INDEX BY BINARY_INTEGER;
x occuname;
BEGIN
x := :occupants;
FOR LROW IN x.FIRST..x.LAST LOOP
x(LROW) := x(LROW) || ' Doe';
END LOOP;
:occupants := x;
END;
/
 
PL/SQL procedure successfully completed.
 
Command> PRINT occupants;
OCCUPANTS    : ARRAY [ 5 ] (Current Size 2)
OCCUPANTS[1] : Pat Doe
OCCUPANTS[2] : Terry Doe