Как получить тип данных столбца в Oracle с PL-SQL с низкими привилегиями? - PullRequest
53 голосов
/ 26 февраля 2010

У меня есть доступ «только для чтения» к нескольким таблицам в базе данных Oracle. Мне нужно получить информацию о схеме по некоторым столбцам. Я хотел бы использовать что-то аналогичное MS SQL sp_help.

В этом запросе отображается таблица, в которой я заинтересован:

SELECT * FROM ALL_TABLES

Когда я запускаю этот запрос, Oracle сообщает мне «таблица не найдена в схеме», и да, параметры верны.

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

После использования моего универсального переводчика Oracle 9000 я предположил, что это не сработает, потому что у меня недостаточно прав. Учитывая мои ограничения, как я могу получить тип данных и длину данных столбца в таблице, к которой у меня есть доступ для чтения, с помощью инструкции PL-SQL?

Ответы [ 9 ]

48 голосов
/ 26 февраля 2010

ALL_TAB_COLUMNS должен запрашиваться из PL / SQL. DESC - это команда 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)
34 голосов
/ 26 февраля 2010

Вы можете использовать команду desc.

desc MY_TABLE

Это даст вам имена столбцов, допустимо ли значение NULL, и тип данных (и длину, если применимо)

15 голосов
/ 19 июня 2013

Лучшее решение, которое я нашел для такого случая, -

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';

@ Аарон Стейнбэк, спасибо за исправление!

15 голосов
/ 07 ноября 2012

Примечание: если вы пытаетесь получить эту информацию для таблиц, которые находятся в другом SCHEMA, используйте представление all_tab_columns, у нас возникает эта проблема, поскольку наши приложения используют другой SCHEMA в целях безопасности.

используйте следующее:

EG:

SELECT
    data_length 
FROM
    all_tab_columns 
WHERE
    upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME'
10 голосов
/ 04 марта 2010
select t.data_type 
  from user_tab_columns t 
 where t.TABLE_NAME = 'xxx' 
   and t.COLUMN_NAME='aaa'
7 голосов
/ 19 июля 2011

Oracle: получите список полного типа данных в вашей таблице:

select data_type || '(' || data_length || ')' 
from user_tab_columns where TABLE_NAME = 'YourTableName'
5 голосов
/ 20 августа 2014
select column_name, data_type || '(' || data_length || ')' as datatype
from all_tab_columns 
where TABLE_NAME = upper('myTableName')
2 голосов
/ 22 сентября 2015

Быстрый и грязный способ (например, посмотреть, как данные хранятся в 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.

покажет, что фиктивный столбец в таблице sys.dual имеет тип = 1 (varchar2), а 10 - тип = 2 (число).

0 голосов
/ 02 марта 2019

Вы можете попробовать это.

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