如何为表中的每一列设置默认值?

时间:2015-10-15 07:01:16

标签: sql oracle

此语法不起作用:

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

如何将NVL()函数应用于STUDENT表中的每一列?

2 个答案:

答案 0 :(得分:3)

我们无法做到这一点。我们需要输入所有列及其各自的NVL()函数。我知道这似乎需要付出很多努力但是如果您的任何专栏都是DATE或其他一些"异国情调"那么请考虑会发生什么。数据类型。

如果你有很多专栏并且你真的想省力,你可以从数据字典中生成条款:

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

剪切并将结果集粘贴到编辑器中。

一旦你开始这条路线,它就会变得更加复杂:

 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;

答案 1 :(得分:0)

可能是这样的(如果你在 11g ),如果你打算写一个PL / SQL,或者只是dbms_output.put_line变量l_query来得到你的查询并执行它 -

这将使用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;
/