sql | what's actually running in the sql engine? viewing the insides of a VIEW
DBMS_UTILITY.EXPAND_SQL_TEXT
wanted to see what was inside a view, but browsing the sidebar was not something I felt like doing
a very innocent and simple sql to view own tables:
SELECT * FROM TAB;
which is, of course, not so simple:
DECLARE
L_CLOB CLOB;
L_SQLSTMT VARCHAR (1000);
BEGIN
L_SQLSTMT := 'SELECT * FROM TAB';
DBMS_UTILITY.EXPAND_SQL_TEXT (INPUT_SQL_TEXT => L_SQLSTMT,
OUTPUT_SQL_TEXT => L_CLOB);
DBMS_OUTPUT.PUT_LINE (L_CLOB);
END;
SELECT "A1"."TNAME" "TNAME",
"A1"."TABTYPE" "TABTYPE",
"A1"."CLUSTERID" "CLUSTERID"
FROM (SELECT "A2"."NAME" "TNAME",
DECODE ("A2"."TYPE#",
2, 'TABLE',
3, 'CLUSTER',
150, 'HIERARCHY',
152, 'ANALYTIC VIEW',
4, 'VIEW',
5, 'SYNONYM') "TABTYPE",
"A3"."TAB#" "CLUSTERID"
FROM "SYS"."TAB$" "A3",
(SELECT "A5"."OBJ#" "OBJ#",
"A5"."DATAOBJ#" "DATAOBJ#",
"A5"."OWNER#" "DEFINING_OWNER#",
"A5"."NAME" "NAME",
"A5"."NAMESPACE" "NAMESPACE",
"A5"."SUBNAME" "SUBNAME",
"A5"."TYPE#" "TYPE#",
"A5"."CTIME" "CTIME",
"A5"."MTIME" "MTIME",
"A5"."STIME" "STIME",
"A5"."STATUS" "STATUS",
"A5"."REMOTEOWNER" "REMOTEOWNER",
"A5"."LINKNAME" "LINKNAME",
"A5"."FLAGS" "FLAGS",
"A5"."OID$" "OID$",
"A5"."SPARE1" "SPARE1",
"A5"."SPARE2" "SPARE2",
"A5"."SPARE3" "SPARE3",
"A5"."SPARE4" "SPARE4",
"A5"."SPARE5" "SPARE5",
"A5"."SPARE6" "SPARE6",
"A5"."SIGNATURE" "SIGNATURE",
"A5"."SPARE7" "SPARE7",
"A5"."SPARE8" "SPARE8",
"A5"."SPARE9" "SPARE9",
"A5"."DFLCOLLID" "DFLCOLLID",
"A5"."CREAPPID" "CREAPPID",
"A5"."CREVERID" "CREVERID",
"A5"."CREPATCHID" "CREPATCHID",
"A5"."MODAPPID" "MODAPPID",
"A5"."MODVERID" "MODVERID",
"A5"."MODPATCHID" "MODPATCHID",
"A5"."SPARE10" "SPARE10",
"A5"."SPARE11" "SPARE11",
"A5"."SPARE12" "SPARE12",
"A5"."SPARE13" "SPARE13",
"A5"."SPARE14" "SPARE14",
"A5"."SPARE3" "OWNER#",
CASE
WHEN ( "A5"."TYPE#" <>
ALL (SELECT "A11"."TYPE#" "TYPE#"
FROM "SYS"."USER_EDITIONING$"
"A11"
WHERE "A11"."USER#" = "A5"."SPARE3")
OR BITAND ("A5"."FLAGS", 1048576) = 1048576
OR BITAND ("A4"."SPARE1", 16) = 0)
THEN
NULL
WHEN "A4"."TYPE#" = 2
THEN
(SELECT "A10"."NAME" "NAME"
FROM "SYS"."OBJ$" "A10"
WHERE "A10"."OBJ#" = "A4"."SPARE2")
ELSE
'ORA$BASE'
END "DEFINING_EDITION"
FROM "SYS"."OBJ$" "A5", "SYS"."USER$" "A4"
WHERE "A5"."OWNER#" = "A4"."USER#"
AND ( "A5"."TYPE#" <>
ALL (SELECT "A9"."TYPE#" "TYPE#"
FROM "SYS"."USER_EDITIONING$" "A9"
WHERE "A9"."USER#" = "A5"."SPARE3")
AND "A5"."TYPE#" <> 88
OR BITAND ("A5"."FLAGS", 1048576) = 1048576
OR BITAND ("A4"."SPARE1", 16) = 0
OR "A5"."TYPE#" =
ANY (SELECT "A8"."TYPE#" "TYPE#"
FROM "SYS"."USER_EDITIONING$" "A8"
WHERE "A8"."USER#" = "A5"."SPARE3")
AND ( "A4"."TYPE#" <> 2
AND SYS_CONTEXT (
'userenv',
'current_edition_name') =
'ORA$BASE'
OR "A4"."TYPE#" = 2
AND "A4"."SPARE2" =
SYS_CONTEXT ('userenv',
'current_edition_id')
OR EXISTS
(SELECT 1 "1"
FROM "SYS"."OBJ$" "A7",
"SYS"."USER$" "A6"
WHERE "A7"."TYPE#" = 88
AND "A7"."DATAOBJ#" =
"A5"."OBJ#"
AND "A7"."OWNER#" =
"A6"."USER#"
AND "A6"."TYPE#" = 2
AND "A6"."SPARE2" =
SYS_CONTEXT (
'userenv',
'current_edition_id')))))
"A2"
WHERE "A2"."OWNER#" = USERENV ('SCHEMAID')
AND "A2"."TYPE#" >= 2
AND "A2"."TYPE#" <= 5
AND "A2"."LINKNAME" IS NULL
AND "A2"."OBJ#" = "A3"."OBJ#"(+)) "A1"