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
が出力されますので、具体的なバインド変数の値を確認することができます。
コメント