[Oracle] SQL*Plusでバインド変数を指定して実行する

Oracle

SQL*Plusでもバインド変数を利用してSQLを実行することができます。
バインド変数をWHERE条件で利用したい場合や、バインド変数の簡易的なテストに活用することができます。

バインド変数を指定する

使い方は非常に簡単で、SQL*Plusで以下のように実行します。
ここではbind1というバインド変数に、7900を指定しています。

variable bind1 number;
exec :bind1 := 7900;

使用例は以下となります。

SQL> variable bind1 number;
SQL> exec :bind1 := 7900;

PL/SQLプロシージャが正常に完了しました。

SQL> select * from scott.emp where empno = :bind1;

     EMPNO ENAME                          JOB                                MGR HIREDATE        SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- -------- ---------- ---------- ----------
      7900 JAMES                          CLERK                             7698 81-12-03        950                    30

SQL>

このように簡単に指定して実行することができます。

ハードパース時のバインド変数の値を確認する方法

Oracleでは、最初に解析されたSQL文の情報(ハードパース時の情報)をメモリ上(共有プール上)に一定期間保持しています。
このハードパース時の情報から、ハードパース時に使用されたバインド変数の値を確認することができます。
確認にはdbms_xplan.display_cursorプロシージャを使います。

まずはv$sqlからバインド変数を確認したいSQL文のSQL_IDを特定します。

SQL> select sql_id, sql_text from v$sql where sql_text like '%empno = :bind1%';

SQL_ID        SQL_TEXT
------------- -------------------------------------------------------------------------
dryav3c2j43c6 select * from scott.emp where empno = :bind1
6653jgvjrkj3c select sql_id, sql_text from v$sql where sql_text like '%empno = :bind1%'

今回はSQL_ID=dryav3c2j43c6が該当します。
このSQL_IDを引数に指定して、dbms_xplan.display_cursorプロシージャを実行します。

SQL> select * from table(dbms_xplan.display_cursor('dryav3c2j43c6', 0, 'peeked_binds'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------
SQL_ID  dryav3c2j43c6, child number 0
-------------------------------------
select * from scott.emp where empno = :bind1

Plan hash value: 2949544139

--------------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |       |       |     1 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    39 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | PK_EMP |     1 |       |     0   (0)|          |
--------------------------------------------------------------------------------------

Peeked Binds (identified by position):
--------------------------------------

   1 - :BIND1 (NUMBER): 7900

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMPNO"=:BIND1)


24行が選択されました。

SQL>

BIND1 (NUMBER): 7900 が出力されますので、具体的なバインド変数の値を確認することができます。

コメント

タイトルとURLをコピーしました