Oracle V$SQLTEXT - Complete SQL Text Retrieval Guide
Oracle V$SQLTEXT - Complete SQL Text Guide
Section titled “Oracle V$SQLTEXT - Complete SQL Text Guide”Retrieve full SQL statement text from Oracle’s dynamic performance views with ready-to-run scripts.
Quick SQL Text Retrieval
Section titled “Quick SQL Text Retrieval”-- Get full SQL text for a specific SQL_IDSELECT SQL_TEXTFROM V$SQLTEXTWHERE SQL_ID = '&sql_id'ORDER BY PIECE;
-- Get SQL with newlines preservedSELECT SQL_TEXTFROM V$SQLTEXT_WITH_NEWLINESWHERE SQL_ID = '&sql_id'ORDER BY PIECE;Understanding V$SQLTEXT Views
Section titled “Understanding V$SQLTEXT Views”V$SQLTEXT vs V$SQL
Section titled “V$SQLTEXT vs V$SQL”| View | SQL Text Column | Max Length | Use Case |
|---|---|---|---|
| V$SQL | SQL_TEXT | 1000 chars | Quick preview, truncated |
| V$SQL | SQL_FULLTEXT | CLOB | Full text, single row |
| V$SQLTEXT | SQL_TEXT | 64 chars per piece | Full text, multiple rows |
| V$SQLTEXT_WITH_NEWLINES | SQL_TEXT | 64 chars per piece | Preserves formatting |
V$SQLTEXT Key Columns
Section titled “V$SQLTEXT Key Columns”| Column | Description |
|---|---|
| SQL_ID | Unique SQL identifier |
| HASH_VALUE | Hash value of the SQL |
| ADDRESS | Parent cursor address |
| PIECE | Piece number (0-based) |
| SQL_TEXT | 64-character chunk |
| COMMAND_TYPE | Statement type (3=SELECT, 6=UPDATE, etc.) |
Reconstructing Full SQL Text
Section titled “Reconstructing Full SQL Text”Using LISTAGG (12c+)
Section titled “Using LISTAGG (12c+)”-- Reconstruct full SQL from piecesSELECT SQL_ID, LISTAGG(SQL_TEXT, '') WITHIN GROUP (ORDER BY PIECE) AS full_sqlFROM V$SQLTEXTWHERE SQL_ID = '&sql_id'GROUP BY SQL_ID;Using XMLAGG (Handles > 4000 chars)
Section titled “Using XMLAGG (Handles > 4000 chars)”-- For very long SQL statementsSELECT SQL_ID, RTRIM(XMLAGG(XMLELEMENT(e, SQL_TEXT) ORDER BY PIECE).EXTRACT('//text()').GETCLOBVAL(), ',') AS full_sqlFROM V$SQLTEXTWHERE SQL_ID = '&sql_id'GROUP BY SQL_ID;Using SQL_FULLTEXT from V$SQL
Section titled “Using SQL_FULLTEXT from V$SQL”-- Simpler approach using CLOBSELECT SQL_ID, SQL_FULLTEXTFROM V$SQLWHERE SQL_ID = '&sql_id'AND CHILD_NUMBER = 0;Finding SQL Statements
Section titled “Finding SQL Statements”Find SQL by Text Pattern
Section titled “Find SQL by Text Pattern”-- Search for SQL containing specific textSELECT DISTINCT SQL_ID, HASH_VALUEFROM V$SQLTEXTWHERE UPPER(SQL_TEXT) LIKE '%EMPLOYEES%'ORDER BY SQL_ID;
-- Get full statement for matching SQLSELECT SQL_ID, SQL_TEXTFROM V$SQLTEXTWHERE SQL_ID IN ( SELECT DISTINCT SQL_ID FROM V$SQLTEXT WHERE UPPER(SQL_TEXT) LIKE '%EMPLOYEES%')ORDER BY SQL_ID, PIECE;Find SQL by Object Name
Section titled “Find SQL by Object Name”-- Find all SQL referencing a specific tableSELECT DISTINCT s.SQL_ID, s.EXECUTIONS, s.ELAPSED_TIME/1000000 AS elapsed_sec, s.SQL_TEXTFROM V$SQL sWHERE s.SQL_ID IN ( SELECT DISTINCT SQL_ID FROM V$SQLTEXT WHERE UPPER(SQL_TEXT) LIKE '%HR.EMPLOYEES%');Currently Executing SQL
Section titled “Currently Executing SQL”-- Get SQL text for active sessionsSELECT s.SID, s.SERIAL#, s.USERNAME, sq.SQL_ID, sq.SQL_FULLTEXTFROM V$SESSION sJOIN V$SQL sq ON s.SQL_ID = sq.SQL_IDWHERE s.STATUS = 'ACTIVE' AND s.USERNAME IS NOT NULL;SQL Text with Performance Metrics
Section titled “SQL Text with Performance Metrics”Top SQL by Elapsed Time
Section titled “Top SQL by Elapsed Time”SELECT s.SQL_ID, s.EXECUTIONS, ROUND(s.ELAPSED_TIME/1000000, 2) AS elapsed_sec, ROUND(s.ELAPSED_TIME/NULLIF(s.EXECUTIONS, 0)/1000000, 4) AS avg_sec, s.BUFFER_GETS, s.DISK_READS, DBMS_LOB.SUBSTR(s.SQL_FULLTEXT, 200, 1) AS sql_previewFROM V$SQL sWHERE s.ELAPSED_TIME > 1000000 -- > 1 second totalORDER BY s.ELAPSED_TIME DESCFETCH FIRST 20 ROWS ONLY;SQL Text with Plan Hash
Section titled “SQL Text with Plan Hash”SELECT s.SQL_ID, s.PLAN_HASH_VALUE, s.EXECUTIONS, s.BUFFER_GETS, t.SQL_TEXTFROM V$SQL sJOIN V$SQLTEXT t ON s.SQL_ID = t.SQL_IDWHERE s.SQL_ID = '&sql_id'ORDER BY t.PIECE;Historical SQL Text (AWR)
Section titled “Historical SQL Text (AWR)”SQL Text from AWR Snapshots
Section titled “SQL Text from AWR Snapshots”-- Get historical SQL textSELECT SQL_TEXTFROM DBA_HIST_SQLTEXTWHERE SQL_ID = '&sql_id';
-- SQL text with AWR statisticsSELECT h.SQL_ID, h.EXECUTIONS_DELTA, h.ELAPSED_TIME_DELTA/1000000 AS elapsed_sec, t.SQL_TEXTFROM DBA_HIST_SQLSTAT hJOIN DBA_HIST_SQLTEXT t ON h.SQL_ID = t.SQL_IDWHERE h.SNAP_ID BETWEEN &begin_snap AND &end_snapORDER BY h.ELAPSED_TIME_DELTA DESCFETCH FIRST 10 ROWS ONLY;Practical Use Cases
Section titled “Practical Use Cases”Export Long SQL for Review
Section titled “Export Long SQL for Review”-- Create formatted output for SQL reviewSET LONG 100000SET LONGCHUNKSIZE 100000SET LINESIZE 200SET PAGESIZE 0SET TRIMSPOOL ON
SPOOL sql_review.txtSELECT SQL_FULLTEXT FROM V$SQL WHERE SQL_ID = '&sql_id';SPOOL OFFCompare SQL Across Environments
Section titled “Compare SQL Across Environments”-- Generate SQL hash for comparisonSELECT SQL_ID, HASH_VALUE, EXACT_MATCHING_SIGNATURE, FORCE_MATCHING_SIGNATUREFROM V$SQLWHERE SQL_ID = '&sql_id';Find SQL with Bind Variables
Section titled “Find SQL with Bind Variables”-- Get SQL text showing bind variable positionsSELECT s.SQL_ID, s.SQL_FULLTEXT, b.NAME AS bind_name, b.POSITION, b.DATATYPE_STRING, b.VALUE_STRINGFROM V$SQL sJOIN V$SQL_BIND_CAPTURE b ON s.SQL_ID = b.SQL_IDWHERE s.SQL_ID = '&sql_id';Command Types Reference
Section titled “Command Types Reference”| COMMAND_TYPE | Statement |
|---|---|
| 1 | CREATE TABLE |
| 2 | INSERT |
| 3 | SELECT |
| 6 | UPDATE |
| 7 | DELETE |
| 9 | CREATE INDEX |
| 26 | LOCK TABLE |
| 42 | ALTER SESSION |
| 47 | PL/SQL EXECUTE |
| 189 | MERGE |
-- Filter by command typeSELECT DISTINCT SQL_IDFROM V$SQLTEXTWHERE COMMAND_TYPE = 3 -- SELECT statements onlyORDER BY SQL_ID;Troubleshooting
Section titled “Troubleshooting”SQL Not Found in V$SQLTEXT
Section titled “SQL Not Found in V$SQLTEXT”Possible causes:
- SQL aged out of shared pool
- Instance restart cleared shared pool
- SQL was explicitly flushed
Solutions:
-- Check AWR for historical SQLSELECT SQL_TEXT FROM DBA_HIST_SQLTEXT WHERE SQL_ID = '&sql_id';
-- Check if SQL is still in cacheSELECT COUNT(*) FROM V$SQL WHERE SQL_ID = '&sql_id';Incomplete SQL Text
Section titled “Incomplete SQL Text”-- Verify all pieces retrievedSELECT SQL_ID, COUNT(*) AS piece_count, MAX(PIECE) + 1 AS expected_piecesFROM V$SQLTEXTWHERE SQL_ID = '&sql_id'GROUP BY SQL_ID;Required Privileges
Section titled “Required Privileges”-- Grant access to V$ viewsGRANT SELECT ON V_$SQLTEXT TO &username;GRANT SELECT ON V_$SQLTEXT_WITH_NEWLINES TO &username;GRANT SELECT ON V_$SQL TO &username;
-- Or grant roleGRANT SELECT_CATALOG_ROLE TO &username;