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.