J'ai un accès "en lecture seule" à quelques tables d'une base de données Oracle. Je dois obtenir des informations de schéma sur certaines des colonnes. Je voudrais utiliser quelque chose d'analogue à sp_help
.
Je vois la table qui m'intéresse listée dans cette requête:
SELECT * FROM ALL_TABLES
Lorsque je lance cette requête, Oracle me dit "table introuvable dans le schéma", et oui les paramètres sont corrects.
SELECT
DBMS_METADATA.GET_DDL('TABLE', 'ITEM_COMMIT_AGG', 'INTAMPS') AS DDL
FROM DUAL;
Après avoir utilisé mon traducteur universel Oracle 9000, j'ai supposé que cela ne fonctionnait pas car je ne disposais pas de privilèges suffisants. Compte tenu de mes contraintes, comment puis-je obtenir le type de données et la longueur des données d'une colonne sur une table à laquelle j'ai accès en lecture avec une instruction PL-SQL?
ALL_TAB_COLUMNS
devrait pouvoir être interrogé à partir de PL/SQL. DESC
est une commande 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)
Vous pouvez utiliser la commande desc
.
desc MY_TABLE
Cela vous donnera les noms des colonnes, si null est valide, et le type de données (et la longueur si applicable)
La meilleure solution que j'ai trouvée pour un tel cas est
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, merci pour la correction!
Remarque: si vous essayez d'obtenir ces informations pour des tables situées dans un SCHEMA différent en utilisant la vue all_tab_columns, nous avons ce problème car nos applications utilisent un autre SCHEMA à des fins de sécurité.
utilisez le suivant:
PAR EXEMPLE:
SELECT
data_length
FROM
all_tab_columns
WHERE
upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME'
select t.data_type
from user_tab_columns t
where t.TABLE_NAME = 'xxx'
and t.COLUMN_NAME='aaa'
Oracle: Obtenir une liste du type de données complet dans votre table:
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')
Méthode rapide et incorrecte (par exemple, pour voir comment les données sont stockées dans 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.
montrera que la colonne factice de la table sys.dual a typ = 1 (varchar2), tandis que 10 correspond à Typ = 2 (nombre).
Vous pouvez essayer ça.
SELECT *
FROM (SELECT column_name,
data_type,
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')
DataTypeWithLength
FROM user_tab_columns
WHERE table_name = 'CONTRACT')
WHERE DataTypeWithLength = 'CHAR(1 Byte)';