2010-02-26 17 views
44

Tengo acceso de "solo lectura" a algunas tablas en una base de datos Oracle. Necesito obtener información de esquema en algunas de las columnas. Me gustaría usar algo similar a MS SQL sp_help.¿Cómo obtengo el tipo de datos de columna en Oracle con PL-SQL con privilegios bajos?

veo la mesa que estoy interesado se señalan en esta consulta:

SELECT * FROM ALL_TABLES 

Cuando ejecuto esta consulta, Oracle me dice "mesa no se encuentran en el esquema", y sí los parámetros son correctos.

SELECT 
DBMS_METADATA.GET_DDL('TABLE', 'ITEM_COMMIT_AGG', 'INTAMPS') AS DDL 
FROM DUAL; 

Después de usar mi traductor universal de Oracle 9000 He conjeturé esto no funciona porque no tiene suficientes privilegios. Dadas mis limitaciones, ¿cómo puedo obtener el tipo de datos y la longitud de datos de una columna en una tabla a la que he leído acceso con una instrucción PL-SQL?

Respuesta

42

ALL_TAB_COLUMNS debería ser consultable desde PL/SQL. DESC es un comando SQL * Plus.

SQL> desc all_tab_columns; 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
OWNER          NOT NULL VARCHAR2(30) 
TABLE_NAME        NOT NULL VARCHAR2(30) 
COLUMN_NAME        NOT NULL VARCHAR2(30) 
DATA_TYPE           VARCHAR2(106) 
DATA_TYPE_MOD          VARCHAR2(3) 
DATA_TYPE_OWNER         VARCHAR2(30) 
DATA_LENGTH        NOT NULL NUMBER 
DATA_PRECISION          NUMBER 
DATA_SCALE           NUMBER 
NULLABLE           VARCHAR2(1) 
COLUMN_ID           NUMBER 
DEFAULT_LENGTH          NUMBER 
DATA_DEFAULT          LONG 
NUM_DISTINCT          NUMBER 
LOW_VALUE           RAW(32) 
HIGH_VALUE           RAW(32) 
DENSITY           NUMBER 
NUM_NULLS           NUMBER 
NUM_BUCKETS          NUMBER 
LAST_ANALYZED          DATE 
SAMPLE_SIZE          NUMBER 
CHARACTER_SET_NAME         VARCHAR2(44) 
CHAR_COL_DECL_LENGTH        NUMBER 
GLOBAL_STATS          VARCHAR2(3) 
USER_STATS           VARCHAR2(3) 
AVG_COL_LEN          NUMBER 
CHAR_LENGTH          NUMBER 
CHAR_USED           VARCHAR2(1) 
V80_FMT_IMAGE          VARCHAR2(3) 
DATA_UPGRADED          VARCHAR2(3) 
HISTOGRAM           VARCHAR2(15) 
+5

Un ejemplo sería bueno. – leanne

+2

@leanne Utiliza esta tabla como esta: 'SELECCIONAR * FROM user_tab_columns WHERE table_name = 'FILL_IN_THE_TABLE_NAME' Y column_name = 'FILL_IN_THE_COLUMN_NAME';' – Tenzin

+0

Sí, @Tenzin: varios ejemplos como el tuyo fueron proporcionados aquí hace un par de años, incluyendo la edición de esta misma publicación. Si hace clic en la línea 'editado ...' en esta respuesta, verá lo que Adam agregó para explicar mejor. (Gracias, Adam!) – leanne

26

Puede usar el comando desc.

desc MY_TABLE 

esto le dará los nombres de columna, ya sea nula es válida, y el tipo de datos (longitud y en su caso)

+0

@akf - Eso funciona, gracias. – James

6
select t.data_type 
    from user_tab_columns t 
where t.TABLE_NAME = 'xxx' 
    and t.COLUMN_NAME='aaa' 
+0

Niza, para las tablas que se encuentran fuera del esquema actual 'user_tab_columns' puede ser reemplazado con' all_tab_columns' –

5

Oracle: Obtener una lista de los tipos de datos completa de la tabla:

select data_type || '(' || data_length || ')' 
from user_tab_columns where TABLE_NAME = 'YourTableName' 
14

Nota: si usted está tratando de obtener esta información para las tablas que se encuentran en un esquema diferente use la vista all_tab_columns, tenemos este problema ya que nuestras aplicaciones usan un SCHEMA diferente por razones de seguridad.

utilizar lo siguiente:

Ejem:

SELECT 
    data_length 
FROM 
    all_tab_columns 
WHERE 
    upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME' 
13

La mejor solución que he encontrado para estos casos es

select column_name, data_type|| 
case 
when data_precision is not null and nvl(data_scale,0)>0 then '('||data_precision||','||data_scale||')' 
when data_precision is not null and nvl(data_scale,0)=0 then '('||data_precision||')' 
when data_precision is null and data_scale is not null then '(*,'||data_scale||')' 
when char_length>0 then '('||char_length|| case char_used 
                 when 'B' then ' Byte' 
                 when 'C' then ' Char' 
                 else null 
              end||')' 
end||decode(nullable, 'N', ' NOT NULL') 
from user_tab_columns 
where table_name = 'TABLE_NAME' 
and column_name = 'COLUMN_NAME'; 

@Aaron Stainback, gracias por la corrección!

+1

es necesario agregar en CHAR_USED por lo que se puede saber si se definió como byte o carbón en algo así como un varchar2 –

+0

esto es bueno código, pero en el caso del campo INT, devuelve "NUMBER (*, 0)" Necesita alguna corrección –

+0

@FirasNizam pruébelo - tal vez no lo entiendo correctamente, pero cuando data_scale es 0 devuelve NUMBER (*), cuando es! = 0 y luego devuelve NUMBER (*, data_scale) – sev3ryn

2
select column_name, data_type || '(' || data_length || ')' as datatype 
from all_tab_columns 
where TABLE_NAME = upper('myTableName') 
1

manera rápida y sucia (por ejemplo, para ver cómo se almacenan los datos en Oracle)

SQL> select dump(dummy) dump_dummy, dummy 
    , dump(10) dump_ten 
from dual 

DUMP_DUMMY  DUMMY DUMP_TEN    
---------------- ----- -------------------- 
Typ=1 Len=1: 88 X  Typ=2 Len=2: 193,11 
1 row selected. 

mostrará que columna ficticia en sys.dual tabla tiene typ = 1 (varchar2), mientras que 10 es Typ = 2 (número).

Cuestiones relacionadas