#sql #oracle
#sql #Oracle
Вопрос:
Я создал скрипт с использованием SQL Server, который просматривал каждую таблицу в базе данных и создал динамическую инструкцию, которая при выполнении отображала имя столбца, тип, количество заполненных значений и общую строку для каждого столбца.
Сейчас я пытаюсь создать то же самое с Oracle, но у меня возникают проблемы. Следующий код возвращает мне таблицу, которая заполнена всеми соответствующими инструкциями, но как я могу их выполнить и отобразить?
>SELECT
'SELECT ''' || atc.column_name || ''', ''' || atc.table_name || ''', ''' || atc.data_type || ''',
SUM(CASE WHEN temp.'|| atc.column_name || ' IS NULL THEN 0 ELSE 1 END) "Filled Values",
COUNT(temp.' || atc.column_name || ') "Total Records"
FROM all_tab_columns atc
JOIN '|| atc.table_name || ' temp ON atc.column_name = ''' ||
atc.column_name ||''' AND atc.table_name = ''' || atc.table_name || '''' AS SQLRow
FROM all_tab_columns atc;
Это пример инструкции, которая создается из приведенного выше кода:
>SELECT 'INITIAL_EXTENT', 'ALL_ALL_TABLES', 'NUMBER',
SUM(CASE WHEN temp.INITIAL_EXTENT IS NULL THEN 0 ELSE 1 END) "Filled Values",
COUNT(temp.INITIAL_EXTENT) "Total Records"
FROM all_tab_columns atc
JOIN ALL_ALL_TABLES temp ON atc.column_name = 'INITIAL_EXTENT' AND atc.table_name = 'ALL_ALL_TABLES'
Ответ №1:
Вот попытка:
declare
myCol1 varchar2(1000);
myCol2 varchar2(1000);
myCol3 varchar2(1000);
myCol4 number;
myCol5 number;
begin
for line in
(
SELECT
'SELECT ''' || atc.column_name || ''', ''' || atc.table_name || ''', ''' || atc.data_type || ''',
SUM(CASE WHEN temp.'|| atc.column_name || ' IS NULL THEN 0 ELSE 1 END) "Filled Values",
COUNT(temp.' || atc.column_name || ') "Total Records"
FROM all_tab_columns atc
JOIN '|| atc.table_name || ' temp ON atc.column_name = ''' ||
atc.column_name ||''' AND atc.table_name = ''' || atc.table_name || '''' AS SQLRow
FROM all_tab_columns atc
)
loop
dbms_output.put_line(myCol1 || ' | ' || myCol2 || ' | ' || myCol3 || ' | ' || myCol4 || ' | ' || myCol5);
execute immediate line.Sqlrow into myCol1, myCol2, myCol3, myCol4, myCol5;
end loop;
end;
/
Здесь используется package DBMS_OUTPUT
для отображения результатов в виде строк; если вы хотите получить результаты в виде набора запросов, рассмотрите возможность использования конвейерных функций.
РЕДАКТИРОВАТЬ : Если вы используете SQL Developer, вы могли бы использовать эту ссылку, чтобы увидеть результаты; для SQL * Plus попробуйте эту. Благодаря этому буферному выводу вы могли видеть, какая таблица с ошибкой для LONG
типа данных (обратите внимание, что в приведенном выше решении я переключил dbms_output
и execute immediate
строки, чтобы таблица отображалась перед выполнением).
Вы также можете найти ограничения на LONG datatype
здесь.
Комментарии:
1. Спасибо @Emmanuel, но когда я запускаю this is, результаты не выводятся. Я также искал конвейерные функции, но я их тоже не очень понимаю.
2. Когда я запускаю код, который вы мне дали, он выполняется около двух минут, а затем жалуется, что это
illegal use of LONG datatype
. Вы знаете, что может быть причиной этого?