Gblog

おもにTips

STS のバインド値

STS (SQL Tuning Set) のバインド値は、DBA_SQLSET_BINDS のVALUE 列から確認が可能です。

ただ、これ、ANYDATA 型。。。

SQL> DESC DBA_SQLSET_BINDS
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SQLSET_NAME                                        VARCHAR2(128)
 SQLSET_OWNER                                       VARCHAR2(128)
 SQLSET_ID                                          NUMBER
 CON_DBID                                           NUMBER
 SQL_ID                                             VARCHAR2(13)
 FORCE_MATCHING_SIGNATURE                           NUMBER
 PLAN_HASH_VALUE                                    NUMBER
 POSITION                                           NUMBER
 VALUE                                              ANYDATA
 CAPTURED                                           CHAR(1)
 SQL_SEQ                                            NUMBER

 データを確認するのにちょっとコツがいります。

 

普通に VALUES列を検索しても格納されているデータは見えません。

SQL> SELECT POSITION, VALUE FROM DBA_SQLSET_BINDS
   2 WHERE SQLSET_NAME='HOGEHOGE' AND SQL_ID='XXXXXXXXXXXXX';

POSITION   VALUES()
---------- -------------
         1 ANYDATA()

 

まずは、型を確認。

SQL> SELECT POSITION, ANYDATA.GETTYPENAME(VALUE) AS TYPE FROM DBA_SQLSET_BINDS 
   2 WHERE SQLSET_NAME='HOGEHOGE' AND SQL_ID='XXXXXXXXXXXXX';

POSITION   TYPE
---------- -------------
         1 SYS.VARCHAR2

 

型にあわせて ACCESS* ファンクションを使用。

SQL> SELECT POSITION, ANYDATA.ACCESSVARCHAR2(VALUE) AS VCHAR2 FROM DBA_SQLSET_BINDS
   2 WHERE SQLSET_NAME='HOGEHOGE' AND SQL_ID='XXXXXXXXXXXXX';

POSITION VCHAR2
-------- -------------
       1 TEST

 今回の場合は、ACCESSVARCHAR2ファンクションを使用していますが、ANYDATA.ACCESSNUMBER や ANYDATA.ACCESSDATA といった、ファンクションもあります。データ型に合わせて使用する必要があり、タイプがマッチしない場合は、NULL が返ります。

 

めんどくさいですが、CASE文にすれば 1SQL で複数タイプのデータを取得することも可能です。めんどくさいですが。