una - ¿Cómo obtengo el tipo de datos de columna en Oracle con PL-SQL con privilegios bajos?
oracle transponer registros columnas (8)
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 análogo a sp_help
MS SQL.
Veo la tabla que me interesa enumerar en esta consulta:
SELECT * FROM ALL_TABLES
Cuando ejecuto esta consulta, Oracle me dice "la tabla no se encuentra 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 Oracle 9000, he supuesto que esto no funciona porque no tengo 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?
La mejor solución que he encontrado para este caso 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!
Manera rápida y sucia (por ejemplo, para ver cómo se almacenan los datos en el oráculo)
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 la columna ficticia en la tabla sys.dual tiene typ = 1 (varchar2), mientras que 10 es Typ = 2 (número).
Nota: si está tratando de obtener esta información para tablas que están en un SCHEMA diferente, use la vista all_tab_columns, tenemos este problema ya que nuestras Aplicaciones usan un SCHEMA diferente por razones de seguridad.
usa lo siguiente:
P.EJ:
SELECT
data_length
FROM
all_tab_columns
WHERE
upper(table_name) = ''MY_TABLE_NAME'' AND upper(column_name) = ''MY_COL_NAME''
Puedes usar el comando desc
.
desc MY_TABLE
Esto le dará los nombres de columna, si null es válido, y el tipo de datos (y la longitud, si corresponde)
ALL_TAB_COLUMNS
debe 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)
Oracle: obtenga una lista del tipo de datos completo en su tabla:
select data_type || ''('' || data_length || '')''
from user_tab_columns where TABLE_NAME = ''YourTableName''
select column_name, data_type || ''('' || data_length || '')'' as datatype
from all_tab_columns
where TABLE_NAME = upper(''myTableName'')
select t.data_type
from user_tab_columns t
where t.TABLE_NAME = ''xxx''
and t.COLUMN_NAME=''aaa''