Выполнение таблицы динамических инструкций SQL

#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 . Вы знаете, что может быть причиной этого?