sql | what's actually running in the sql engine? viewing the insides of a VIEW

DBMS_UTILITY.EXPAND_SQL_TEXT

·

2 min read

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"