EXECUTE IMMEDIATEを使用する例
TimesTenでは、EXECUTE IMMEDIATE
文がサポートされています。
「PL/SQLでの動的SQL (EXECUTE IMMEDIATE文)」を参照してください。この項では、TimesTenでPL/SQLアプリケーションを開発する際の検討事項を次の例で説明します。
EXECUTE IMMEDIATEを使用した表の作成
コンパイル時に表定義がわからない場合を考えてみます。EXECUTE IMMEDIATE
文を使用することで、実行時に表を作成できます。
この例では、EXECUTE IMMEDIATE
文を使用して表を作成するプロシージャを表示します。プロシージャはパラメータとして渡された表の名前および列定義を使用して実行され、その後、表の作成が確認されます。
Command> CREATE OR REPLACE PROCEDURE create_table
(p_table_name VARCHAR2, p_col_specs VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' || p_table_name
|| ' (' || p_col_specs|| ' )';
END;
/
Procedure created.
プロシージャを実行して、表が作成されていることを確認します。
Command> BEGIN
create_table ('EMPLOYEES_NAMES', 'id NUMBER (4)
PRIMARY KEY, name VARCHAR2 (40)');
END;
/
PL/SQL procedure successfully completed.
Command> DESCRIBE employees_names;
Table USER.EMPLOYEES_NAMES:
Columns:
*ID NUMBER (4) NOT NULL
NAME VARCHAR2 (40) INLINE
1 table found.
(primary key columns are indicated with *)
単一行問合せでのEXECUTE IMMEDIATEの使用
問合せ内でSQLのEXECUTE IMMEDIATE文を使用できます。
この例では、ファンクションget_emp
は従業員レコードを取得します。ファンクションを実行して、v_emprec
に結果を戻します。
Command> CREATE OR REPLACE FUNCTION get_emp (p_emp_id NUMBER)
RETURN employees%ROWTYPE IS
v_stmt VARCHAR2 (200);
v_emprec employees%ROWTYPE;
BEGIN
v_stmt:= 'SELECT * FROM EMPLOYEES '||
'WHERE employee_id = :p_emp_id';
EXECUTE IMMEDIATE v_stmt INTO v_emprec USING p_emp_id;
RETURN v_emprec;
END;
/
Function created.
Command> DECLARE
v_emprec employees%ROWTYPE := GET_EMP (100);
BEGIN
DBMS_OUTPUT.PUT_LINE ('Employee: ' || v_emprec.last_name);
END;
/
Employee: King
PL/SQL procedure successfully completed.
EXECUTE IMMEDIATEを使用した接続属性の変更
この例では、EXECUTE IMMEDIATE
文をALTER SESSION
とともに使用してPLSQL_OPTIMIZE_LEVEL
設定を変更し、変更前および変更後にttConfiguration
組込みプロシージャをコールして結果を確認します。
次の例では、EXECUTE IMMEDIATE
文の内部からttConfiguration
をコールします。『Oracle TimesTen In-Memory Databaseリファレンス』のttConfigurationを参照してください。
Command> call ttconfiguration;
...
< PLSQL_CCFLAGS, <NULL> >
< PLSQL_CODE_TYPE, INTERPRETED >
< PLSQL_CONN_MEM_LIMIT, 100 >
< PLSQL_MEMORY_ADDRESS, 0x10000000 >
< PLSQL_MEMORY_SIZE, 128 >
< PLSQL_OPTIMIZE_LEVEL, 2 >
< PLSQL_TIMEOUT, 30 >
...
54 rows found.
Command> begin
execute immediate 'alter session set PLSQL_OPTIMIZE_LEVEL=3';
end;
/
PL/SQL procedure successfully completed.
Command> call ttconfiguration;
...
< PLSQL_CCFLAGS, <NULL> >
< PLSQL_CODE_TYPE, INTERPRETED >
< PLSQL_CONN_MEM_LIMIT, 100 >
< PLSQL_MEMORY_ADDRESS, 0x10000000 >
< PLSQL_MEMORY_SIZE, 128 >
< PLSQL_OPTIMIZE_LEVEL, 3 >
< PLSQL_TIMEOUT, 30 >
...
54 rows found.
EXECUTE IMMEDIATEを使用したTimesTen組込みプロシージャのコール
PL/SQLでは、CALL
構文を使用したEXECUTE IMMEDIATE
文を使用してTimesTen組込みプロシージャをコールできます。
たとえば、組込みプロシージャttConfiguration
をコールして、その出力結果セットを戻すには、PL/SQLレコード型を作成し、BULK COLLECT
を使用したEXECUTE IMMEDIATE
を使用して、結果セットを配列にフェッチします。
『Oracle TimesTen In-Memory Databaseリファレンス』の組込みプロシージャを参照してください。
Command> DECLARE
TYPE ttConfig_record IS RECORD
(name varchar2(255), value varchar2 (255));
TYPE ttConfig_table IS TABLE OF ttConfig_record;
v_ttConfigs ttConfig_table;
BEGIN
EXECUTE IMMEDIATE 'CALL ttConfiguration'
BULK COLLECT into v_ttConfigs;
DBMS_OUTPUT.PUT_LINE ('Name: ' || v_ttConfigs(7).name
|| ' Value: ' || v_ttConfigs(7).value);
END;
/
Name: CommitBufferSizeMax Value: 10
PL/SQL procedure successfully completed.
TimesTen固有の構文でのEXECUTE IMMEDIATEの使用
この例では、EXECUTE IMMEDIATE
文を使用して、TimesTen SELECT FIRST
n
文を実行します。この構文はTimesTenに固有です。
Command> DECLARE v_empid NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT FIRST 1 employee_id FROM employees'
INTO v_empid;
DBMS_OUTPUT.PUT_LINE ('Employee id: ' || v_empid);
END;
/
Employee id: 100
PL/SQL procedure successfully completed.