ttIsqlでの変数の使用、宣言および設定

ttIsqlでバインド変数を宣言、設定および使用できます。

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

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

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

ノート:

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

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

ノート:

Oracle TimesTen In-Memory DatabaseリファレンスttIsqlを参照してください。

Command> VARIABLE house_number NUMBER := 268;
Command> PRINT house_number;
HOUSE_NUMBER            : 268

Command> VARIABLE street_name VARCHAR2(15);
Command> SETVARIABLE street_name := 'Oracle Parkway'; 

Command> VARIABLE occupants[5] VARCHAR2(15);
Command> SETVARIABLE occupants[1] := 'Pat'; 
Command> SETVARIABLE occupants[2] := 'Terry';
Command> PRINT occupants;
OCCUPANTS            : ARRAY [ 5 ] (Current Size 2)
OCCUPANTS[1] : Pat
OCCUPANTS[2] : Terry

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

Command> VARIABLE occupants[5] VARCHAR2(15) := ['Pat', 'Terry'];
Command> PRINT occupants;
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

取得した列のバインド変数の自動作成

ttIsqlにautovariablesを構成すると、TimesTenでは、最後にフェッチした行の各列名を使用したバインド変数を自動作成します。自動バインド変数は、他のすべてのバインド変数と同様に使用できます。

次の例では、employees表からすべての行が選択されます。すべての列が取得されるので、自動変数が作成され、各列に名前が付けられます。このバインド変数には、各列で取得した最後の値が含まれます。

Command> SET AUTOVARIABLES ON;
Command> SELECT * FROM employees;
...
< 204, Hermann, Baer, HBAER, 515.123.8888, 1994-06-07 00:00:00, PR_REP, 10000,
 <NULL>, 101, 70 >
< 205, Shelley, Higgins, SHIGGINS, 515.123.8080, 1994-06-07 00:00:00, AC_MGR, 
12000, <NULL>, 101, 110 >
< 206, William, Gietz, WGIETZ, 515.123.8181, 1994-06-07 00:00:00, AC_ACCOUNT, 
8300, <NULL>, 205, 110 >

Command> PRINT;
EMPLOYEE_ID          : 206
FIRST_NAME           : William
LAST_NAME            : Gietz
EMAIL                : WGIETZ
PHONE_NUMBER         : 515.123.8181
HIRE_DATE            : 1994-06-07 00:00:00
JOB_ID               : AC_ACCOUNT
SALARY               : 8300
COMMISSION_PCT       : <NULL>
MANAGER_ID           : 205
DEPARTMENT_ID        : 110

列名として別名を渡すと、自動バインド変数名に列名ではなくその別名が使用されます。

Command> SET AUTOVARIABLES ON;
Command> SELECT employee_id ID, First_name SURNAME, last_name LASTNAME 
 FROM employees;
 
ID, SURNAME, LASTNAME
...
< 204, Hermann, Baer >
< 205, Shelley, Higgins >
< 206, William, Gietz >
107 rows found.
Command> PRINT;
ID                   : 206
SURNAME              : William
LASTNAME             : Gietz

既知の列名を指定せずにデータをフェッチする問合せでは、列名を表示するようにcolumnlabels onを設定します。次の例では、ttConfiguration組込みプロシージャによって、paramnameおよびparamvalueの列が返されています。

Command> SET AUTOVARIABLES ON;
Command> SET COLUMNLABELS ON;

Command> call TTCONFIGURATION('LockLevel');

PARAMNAME, PARAMVALUE
< LockLevel, 0 >
1 row found.

Command> IF :paramvalue = 1 THEN "e:Database-level locking is enabled";
Command> IF NOT  :paramvalue = 1 THEN "e:Row-level locking is enabled";
Row-level locking is enabled

また、describeを使用すると列名を表示することもできます。次の例では、describeコマンドを使用し、ttConfiguration組込みプロシージャの列名を表示します。

Command> DESCRIBE TTCONFIGURATION;
 
Procedure TTCONFIGURATION:
  Parameters:
    PARAMNAME                       TT_VARCHAR (30)
  Columns:
    PARAMNAME                       TT_VARCHAR (30) NOT NULL
    PARAMVALUE                      TT_VARCHAR (1024)
 
1 procedure found.