web-dev-qa-db-fra.com

Comment obtenir le type de données de colonne dans Oracle avec PL-SQL avec de faibles privilèges?

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?

55
James

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)
51
Adam Musch

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)

35
akf

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!

17
sev3ryn

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'
16
Lorin Davis
select t.data_type 
  from user_tab_columns t 
 where t.TABLE_NAME = 'xxx' 
   and t.COLUMN_NAME='aaa'
11
Ibrahim Bayer

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'
8
Eric Leschinski
select column_name, data_type || '(' || data_length || ')' as datatype
from all_tab_columns 
where TABLE_NAME = upper('myTableName')
5
matteo.poletti

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).

2
Tagar

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)';
0
R Muruganandhan