Oracle - 比较列的默认值

时间:2013-04-10 06:09:44

标签: sql oracle

我正在尝试识别具有默认值NULL或尚未设置默认值的数据库列。因为我正在执行查询,如..

SELECT T.TABLE_NAME,CL.COLUMN_NAME,CL.DATA_DEFAULT

    FROM   SYS.USER_TABLES T
               JOIN SYS.USER_TAB_COLUMNS CL ON T.TABLE_NAME = CL.TABLE_NAME

    WHERE  CL.DATA_DEFAULT IS NULL

    ORDER  BY t.table_name

在此查询的输出中,我得到的默认值未设置的列(空),但我没有得到默认值为NULL的列

4 个答案:

答案 0 :(得分:4)

在oracle(至少11g)中如果你没有给列提供默认值,就像给它null一样。

See this example


更新感谢@pratik garg评论,我现在明白您真正要求的是查询long列的方法。
由于@PratikGrag在您定义defualt null时声明,因此LONG列DATA_DEFAULT将包含'null'。

由于USER_TAB_COLUMNS没有可用的ROWID,我能想到的唯一方法就是使用PLSQL。

这样的事情:

BEGIN
FOR rec IN (SELECT T.TABLE_NAME,CL.COLUMN_NAME,CL.DATA_DEFAULT
    FROM   SYS.USER_TABLES T
               JOIN SYS.USER_TAB_COLUMNS CL ON T.TABLE_NAME = CL.TABLE_NAME
   ORDER  BY t.table_name) LOOP

  IF rec.DATA_DEFAULT = 'null' THEN
    dbms_output.put_line(rec.table_name || ' ' || rec.COLUMN_NAME);
  END IF;
END LOOP;
END;

答案 1 :(得分:4)

您也可以尝试使用以下查询 -

WITH xml AS (
         SELECT XMLTYPE(
                    DBMS_XMLGEN.GETXML('SELECT table_name, column_name ,DATA_DEFAULT FROM user_tab_cols')
                    ) AS xml
          FROM   dual
          )
SELECT * FROM ( 
 SELECT extractValue(xs.object_value, '/ROW/TABLE_NAME')       AS table_name
  ,      extractValue(xs.object_value, '/ROW/COLUMN_NAME')      AS column_name
  ,      extractValue(xs.object_value, '/ROW/DATA_DEFAULT')  AS DATA_DEFAULT
  FROM   xml x
  ,      TABLE(XMLSEQUENCE(EXTRACT(x.xml, '/ROWSET/ROW'))) xs
  ) WHERE (DATA_DEFAULT IS NULL OR UPPER(DATA_DEFAULT) = 'NULL')
;

上面的查询存在一些问题,您需要花费更多时间来获得结果,但是您会得到正确的结果。

答案 2 :(得分:0)

有,

SELECT T.TABLE_NAME,CL.COLUMN_NAME,CL.DATA_DEFAULT

FROM   SYS.USER_TABLES T
           JOIN SYS.USER_TAB_COLUMNS CL ON T.TABLE_NAME = CL.TABLE_NAME

WHERE  ( CL.DATA_DEFAULT IS NULL OR LENGTH(CL.DATA_DEFAULT || '') < 1 )

ORDER  BY t.table_name

答案 3 :(得分:0)

空意味着NULL同一件事......