Как преобразовать запись внутри курсора в имя столбца для оператора select? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь подсчитать количество нулевых значений для каждого столбца для данной таблицы.

Мой курсор (t_col_name) содержит список столбцов из моей таблицы.

--select count(*) from sh.costs where promo_id is null  result:78425
DECLARE 
  null_count number;    
  t_col_name ALL_TAB_COLUMNS.COLUMN_NAME%type; 
  CURSOR c_column_name is 
      select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME = 'COSTS';

BEGIN 
    dbms_output.put_line('Null Count');  
    OPEN c_column_name; 
    LOOP 
    FETCH c_column_name into t_col_name; 
      EXIT WHEN c_column_name%notfound; 
    select count(*) into v_count from sh.costs where t_col_name is 
    null;
    dbms_output.put_line(t_col_name || ' '|| null_count); 
    END LOOP; 
    CLOSE c_column_name;   
END;

Фактический результат:

Null count
PROD_ID 0
TIME_ID 0
PROMO_ID 0
CHANNEL_ID 0
UNIT_COST 0
UNIT_PRICE 0

Ожидаемый результат:

Null count
PROD_ID 0
TIME_ID 0
PROMO_ID 78425
CHANNEL_ID 0
UNIT_COST 0
UNIT_PRICE 0

Проблема связана с моим SQL-запросом:

select count(*) into v_count from sh.costs where t_col_name is null;

t_col_name передается в виде строки вместо имени столбца.

Когда я изменяю запрос на фактическое имя столбца, я получаю правильное количество для столбца, то есть:

select count(*) into v_count from sh.costs where promo_id is null;

Null count
PROD_ID 78425
TIME_ID 78425
PROMO_ID 78425
CHANNEL_ID 78425
UNIT_COST 78425
UNIT_PRICE 78425

1 Ответ

0 голосов
/ 14 февраля 2019

Вот как: вам нужен динамический SQL , потому что вы должны передать (столбец и) имя столбца в оператор SELECT.

SQL> declare
  2    l_cnt number;
  3  begin
  4    for cur_r in (select table_name, column_name
  5                  from user_tab_columns
  6                  where table_name in ('EMP', 'DEPT')
  7                 )
  8    loop
  9      execute immediate 'select count(*) from ' || cur_r.table_name ||
 10                        ' where ' || cur_r.column_name || ' is null'
 11              into l_cnt;
 12      dbms_output.put_line(rpad(cur_r.table_name ||'.'|| cur_r.column_name, 20, ' ')
 13         ||': ' || l_cnt);
 14    end loop;
 15  end;
 16  /
DEPT.LOC            : 0
DEPT.DEPTNO         : 0
DEPT.DNAME          : 0
EMP.EMPNO           : 0
EMP.ENAME           : 0
EMP.JOB             : 0
EMP.MGR             : 1
EMP.HIREDATE        : 0
EMP.SAL             : 0
EMP.COMM            : 9
EMP.DEPTNO          : 0

PL/SQL procedure successfully completed.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...