我正在尝试识别具有默认值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的列
答案 0 :(得分:4)
在oracle(至少11g)中如果你没有给列提供默认值,就像给它null
一样。
更新感谢@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同一件事......