Oracle 23ai에 DBMS_SQLDIAG.REPORT_SQL 함수가 추가되었습니다. 이 함수는 SQL 문에 대한 정보를 포함한 리포트를 HTML 형식을 반환합니다.
DBMS_SQLDIAG.REPORT_SQL 함수의 정의는 아래와 같습니다. directory에 값을 입력하면 디렉토리에 SQLR_<SQL_ID>_<YYYYMMDDHH24MI>.html 형식의 파일이 생성됩니다.
DBMS_SQLDIAG.REPORT_SQL (
sql_id IN VARCHAR2
, directory IN VARCHAR2 DEFAULT NULL
, level IN VARCHAR2 DEFAULT 'TYPICAL' -- BASIC, TYPICAL, ALL
)
RETURN CLOB;
테스트를 위해 아래와 같이 테이블과 인덱스를 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE TABLE t1 (c1, c2) AS SELECT ROWNUM, LPAD ('X', 500, 'X') FROM XMLTABLE ('1 to 10000');
CREATE INDEX t1_x1 ON t1 (c1);
아래와 같이 SQL 문을 수행하겠습니다.
-- 2
VAR b1 NUMBER = 100
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM t1 WHERE c1 <= :b1;
SQL_ID 859pscyvz1grs, child number 0
-------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM t1 WHERE c1 <= :b1
Plan hash value: 711837727
------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads |
------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 9 (100)| | 100 |00:00:00.01 | 12 | 1 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| T1 | 1 | 3002 | 776K| 9 (0)| 00:00:01 | 100 |00:00:00.01 | 12 | 1 |
|* 2 | INDEX RANGE SCAN | T1_X1 | 1 | 540 | | 2 (0)| 00:00:01 | 100 |00:00:00.01 | 3 | 1 |
------------------------------------------------------------------------------------------------------------------------------------------------
DBMS_SQLDIAG.REPORT_SQL 함수는 쿼리에 사용할 수 없습니다.
-- 3
SELECT DBMS_SQLDIAG.REPORT_SQL (sql_id => '859pscyvz1grs');
ORA-14551: cannot perform a DML operation inside a query
아래와 같이 SQL 리포트를 생성할 수 있습니다.
-- 4
VAR b_report CLOB;
EXEC :b_report := DBMS_SQLDIAG.REPORT_SQL (sql_id => '859pscyvz1grs', level => 'ALL');
SET FEEDBACK OFF
SET LINESIZE 32767
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET PAGESIZE 0
SET TIMING OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
SPOOL SQLR.html
SELECT :b_report AS report FROM DUAL;
SPOOL OFF
아래는 생성된 리포트입니다.
관련 링크
[2025-07-30]
해당 기능이 Oracle 19.28 버전으로 백포트되었습니다.