#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. Ба, @Уильям, моя идея состояла в том, чтобы просто показать, как это делается. МАКС вполне подходил для двух крошечных столиков Скотта. Я не знаю, что именно нужно оператору.