Извлеките имя таблицы, имя столбца, тип данных, длину данных и пример значения в базе данных Oracle

#sql #oracle

Вопрос:

На моей работе я столкнулся со странным запросом относительно извлечения структуры базы данных. В этом извлечении запрашивающему требуется имя таблицы, имя столбца, тип столбца и максимальная длина столбцов VARCHAR. Кроме того, был задан вопрос, есть ли возможность привести также пример ценности.

Это мой вопрос, на данный момент

 SELECT 
    table_name, 
    column_name, 
    data_type,
    CASE WHEN (data_type = 'VARCHAR' OR data_type = 'VARCHAR2') THEN TO_CHAR(char_length) ELSE '-' END AS char_length 
FROM all_tab_cols 
WHERE owner = 'DB_OWNER' 
ORDER BY table_name;
 

Есть ли возможность сделать аналогичный запрос, добавив также пример значения, содержащегося в каждом столбце?

Лично я думаю, что это невозможно, если не использовать очень сложную (и тяжелую) хранимую процедуру, но, вероятно, у кого-то более опытного, чем я, в администрировании баз данных есть лучший вклад.

Заранее спасибо

Комментарии:

1. Вы уверены, что вам нужны ALL_TAB_COLS , которые включают сгенерированные системой скрытые столбцы, а не стандартные ALL_TAB_COLUMNS ?

Ответ №1:

Динамический SQL-это то, что вам нужно. Например:

 SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
  2     l_val  VARCHAR2 (20);
  3  BEGIN
  4     FOR cur_r IN (  SELECT table_name,
  5                            column_name,
  6                            data_type,
  7                            CASE
  8                               WHEN (   data_type = 'VARCHAR'
  9                                     OR data_type = 'VARCHAR2')
 10                               THEN
 11                                  TO_CHAR (char_length)
 12                               ELSE
 13                                  '-'
 14                            END AS char_length
 15                       FROM all_tab_cols
 16                      WHERE     owner = 'SCOTT'
 17                            AND table_name IN ('DEPT', 'EMP')
 18                   ORDER BY table_name)
 19     LOOP
 20        EXECUTE IMMEDIATE   'select max('
 21                         || cur_r.column_name
 22                         || ') from '
 23                         || cur_r.table_name
 24           INTO l_val;
 25
 26        DBMS_OUTPUT.put_line (
 27              RPAD (cur_r.table_name || '.' || cur_r.column_name, 15, ' ')
 28           || ': '
 29           || l_val);
 30     END LOOP;
 31  END;
 32  /
DEPT.DEPTNO    : 40
DEPT.LOC       : NEW YORK
DEPT.DNAME     : test
EMP.MGR        : 7902
EMP.HIREDATE   : 12.01.1983 00:00
EMP.SAL        : 5000
EMP.COMM       : 1400
EMP.DEPTNO     : 30
EMP.ENAME      : WARD
EMP.EMPNO      : 7934
EMP.JOB        : SALESMAN

PL/SQL procedure successfully completed.

SQL>
 

Комментарии:

1. Для большинства систем, над которыми я работал, это заняло бы недели. Действительно ли оператору нужно максимальное значение или просто любое ненулевое значение?

2. Ба, @Уильям, моя идея состояла в том, чтобы просто показать, как это делается. МАКС вполне подходил для двух крошечных столиков Скотта. Я не знаю, что именно нужно оператору.