Script de descripción de tablas mejorado

He introducido una mejora en el script que utilizo para describir tablas en el plus. En principio, tal como dije, me describe tablas del esquema en el que estoy. Esto lo hice así porque paso de estar todo el rato metiendo el nombre del usuario cuando, el 99,99% de los desc que hago son siempre de tablas o vistas del usuario con el que estoy conectado. Bueno, lo que he hecho es que el script se de cuenta de si lo que he escrito es un sinónimo. Y entonces da el cambiazo y describe en realidad la tabla a la que apunta el sinónimo, aunque sea de otro esquema.

-- Script mejorado para obtener la descripción de una tabla o de 
-- un sinónimo que apunte a una tabla.
-- http://www.tsoracle.com
--------------
-- Sección Set
--------------
SET LINES  120
SET HEADING ON
SET VERIFY OFF
-------------------------
-- Definición de columnas
-------------------------
COLUMN CLAVE_PRIMARIA FORMAT A1 
COLUMN COLUMN_NAME    FORMAT A20 
COLUMN TIPO           FORMAT A15 
COLUMN DEFECTO        FORMAT A15 
COLUMN COMENTARIO     FORMAT A43 
COLUMN COMMENTS       FORMAT A69 
COLUMN TABLA_FORANEA  FORMAT A40 
-------------
-- Parámetros
-------------
ACCEPT tabla PROMPT "Escribe el nombre de la tabla: "
PROMPT .
----------------------------------
-- Ver si es un sinónimo de tabla
---------------------------------
var owner varchar2(30)
var tabla varchar2(30)
DECLARE
  
BEGIN
  -- Veo si es un sinónimo lo que me están pidiendo
  SELECT TABLE_OWNER, TABLE_NAME
  INTO   :owner,      :tabla
  FROM   USER_SYNONYMS
  WHERE  SYNONYM_NAME = UPPER( '&&tabla' );
EXCEPTION 
  WHEN NO_DATA_FOUND THEN 
    -- No es un sinónimo
    :owner := USER;
    :tabla := UPPER( '&&tabla' );
END;
/
----------
-- Selects
----------
SELECT DECODE( OWNER, USER, NULL, OWNER || '.' ) ||
       TABLE_NAME AS TABLE_NAME, COMMENTS
FROM   ALL_TAB_COMMENTS
WHERE  OWNER      = :owner
  AND  TABLE_NAME = :tabla
/
SELECT P.PK CLAVE_PRIMARIA,
       M.COLUMN_NAME, 
       M.DATA_TYPE || DECODE( M.DATA_TYPE, 
                              /*************************************/
                              'DATE', NULL, -- Poner aquí los tipos
                              'LONG', NULL, -- de varible para los 
                              'BLOB', NULL, -- que no queramos ver
                              'CLOB', NULL, -- la precisión
                              /*************************************/
                              '(' || TO_CHAR( NVL( M.DATA_PRECISION, 
                                                   M.DATA_LENGTH))||
                              DECODE( M.DATA_SCALE, NULL, NULL, 
                                      ',' ||
                                      TO_CHAR( M.DATA_SCALE ) ) ||
                              ')' ) TIPO,
       M.NULLABLE,
       M.DATA_DEFAULT DEFECTO,
       C.COMMENTS COMENTARIO
FROM   ( SELECT N.TABLE_NAME, L.COLUMN_NAME, '*' PK
         FROM   ALL_CONS_COLUMNS L, ALL_CONSTRAINTS N
         WHERE  L.CONSTRAINT_NAME = N.CONSTRAINT_NAME
           AND  L.OWNER      = :owner
           AND  N.OWNER      = :owner
           AND  N.TABLE_NAME = :tabla
           AND  N.CONSTRAINT_TYPE = 'P' ) P, -- Clave primaria
       ALL_TAB_COLUMNS M, ALL_COL_COMMENTS C
WHERE  M.TABLE_NAME  = C.TABLE_NAME
  AND  M.COLUMN_NAME = C.COLUMN_NAME
  AND  M.OWNER       = C.OWNER
  AND  M.TABLE_NAME  = P.TABLE_NAME  (+)
  AND  M.COLUMN_NAME = P.COLUMN_NAME (+)
  AND  M.TABLE_NAME  = :tabla
  AND  M.OWNER       = :owner
ORDER BY M.COLUMN_ID
/
PROMPT CLAVES FORÁNEAS:
BREAK ON TABLA_FORANEA
SELECT DECODE( B.OWNER, :owner, NULL, B.OWNER || '.' ) ||
       B.TABLE_NAME TABLA_FORANEA, 
       C.COLUMN_NAME
FROM   ALL_CONS_COLUMNS C, ALL_CONSTRAINTS A, ALL_CONSTRAINTS B
WHERE  A.R_CONSTRAINT_NAME = B.CONSTRAINT_NAME
  AND  A.CONSTRAINT_NAME   = C.CONSTRAINT_NAME
  AND  A.OWNER             = C.OWNER
  AND  A.TABLE_NAME        = :tabla
  AND  A.OWNER             = :owner
  AND  A.CONSTRAINT_TYPE   = 'R'
ORDER BY B.TABLE_NAME, C.POSITION
/
SET VERIFY ON
Anuncios