2015-10-15 4 views
0

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

select nvl(student.*,0) 
from student ; 

Как я могу применить функцию NVL() для каждого столбца в таблице СТУДЕНТ?

+0

Вы можете задать свой вопрос, пожалуйста? Вы хотите выбрать пустые значения или вставить? – Tatiana

+0

нравится [это] (http://stackoverflow.com/questions/26064254/select-all-columns-except-null-or-nvl-all-null)? – SomeJavaGuy

+0

Зачем вы ставите нулевые значения во всех столбцах? – brenners1302

ответ

3

Мы не можем этого сделать. Нам нужно напечатать все столбцы и их отдельные функции NVL(). Я знаю, что это похоже на много усилий, но подумайте о том, что произойдет, если какой-либо из ваших столбцов будет DATE или каким-то другим «экзотическим» типом данных.

Если у вас есть много столбцов, и вы действительно хотите, чтобы сэкономить усилия, которые вы могли бы генерировать пункты из словаря данных:

select 'nvl('|| column_name || ', 0)' 
from user_tab_columns 
where table_name = 'STUDENT' 
order by column_id; 

Cut'n'paste результирующего набора в редакторе.

После того, как вы начнете по этому маршруту легко получить более изощренными:

select case when column_id > 1 then ',' end || 
     'nvl('|| column_name || ',' || 
     case when data_type = 'DATE' then 'sysdate' 
      when data_type = 'VARCHAR2' then '''DEF''' 
      else '0' end || 
     ')' 
from user_tab_columns 
where table_name = 'STUDENT' 
order by column_id; 
0

Вероятно, что-то вроде этого (если вы на 11g), если вы собираетесь писать PL/SQL, либо просто dbms_output.put_line переменную l_query, чтобы получить ваш запрос и выполнить it-

Это даст вам запрос с использованием всех столбцов NVL -

SELECT 'SELECT '|| listagg ('nvl('||column_name, ',0),') 
          WITHIN GROUP (ORDER BY column_name) ||',0) FROM TABLE1' 
    FROM all_tab_columns 
    WHERE table_name='TABLE1'; 

И это реализация внутри PL/SQL-

DECLARE 
    v_record table1%rowtype; 
BEGIN 
    SELECT 'SELECT '|| listagg ('nvl('||column_name, ',0),') 
           WITHIN GROUP (ORDER BY column_name) ||',0) FROM TABLE1' 
    INTO l_query 
    FROM all_tab_columns 
    WHERE table_name='TABLE1'; 

    l_query := l_query ||' WHERE rownum<=1000'; --add where clause if you want to 

    OPEN tab_cursor FOR l_query; 
    LOOP 
    FETCH tab_cursor INTO v_record; 
    EXIT WHEN tab_cursor%NOTFOUND; 
    END LOOP; 

    --Do something with v_record 
END; 
/
Смежные вопросы