2

我正在尝试识别默认值为 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

4 回答 4

5

您也可以尝试以下查询 -

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')
;

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

于 2013-04-10T07:21:41.683 回答
4

在 oracle 中(至少对于 11g),如果您不给列提供默认值,就像给它一样null

看这个例子


更新感谢@pratik garg 评论,我现在明白您真正要求的是一种查询long列的方法。
因为正如@PratikGrag 在您定义defualt nullLONG 列时所说的那样,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;
于 2013-04-10T06:16:52.757 回答
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
于 2013-04-10T06:17:54.200 回答
0

空意味着 NULL 它是一回事......

于 2013-04-10T06:17:59.443 回答