CREATE OR REPLACE PROCEDURE check_uncons_columns_for_null (
p_schema VARCHAR2,
p_table_name VARCHAR2 DEFAULT NULL
)
IS
CURSOR x
IS
SELECT table_name, column_name,
MAX (column_name) OVER (PARTITION BY table_name) AS lastcol
FROM (SELECT a.table_name, a.column_name
FROM dba_tab_columns a
WHERE a.owner = p_schema
AND a.table_name = NVL (UPPER (p_table_name), a.table_name)
MINUS
SELECT a.table_name, b.column_name
FROM dba_cons_columns b, dba_constraints a
WHERE a.owner = p_schema
AND a.constraint_type = 'C'
AND a.table_name = NVL (UPPER (p_table_name), a.table_name)
AND a.table_name = b.table_name
AND a.owner = b.owner
AND a.constraint_name = b.constraint_name)
ORDER BY 1, 2;
str0 VARCHAR2 (32767);
str1 VARCHAR2 (32767);
str2 VARCHAR2 (32767);
str3 VARCHAR2 (32767);
prev VARCHAR2 (100) := '*';
cnt NUMBER;
trailer VARCHAR2 (5);
PROCEDURE do_sql (thesql VARCHAR2)
IS
tcursor INTEGER;
dummy INTEGER;
BEGIN
tcursor := DBMS_SQL.open_cursor;
DBMS_SQL.parse (tcursor, thesql, 2);
dummy := DBMS_SQL.EXECUTE (tcursor);
DBMS_SQL.close_cursor (tcursor);
END;
BEGIN
FOR i IN x
LOOP
IF prev != i.table_name
THEN
str0 := 'declare ';
str1 := 'begin select ';
str2 := ' into ';
str3 := ' ';
cnt := 1;
END IF;
IF i.column_name = i.lastcol
THEN
trailer := ' ';
ELSE
trailer := ',' || CHR (10);
END IF;
str0 := str0 || 'v' || LTRIM (cnt) || ' number;';
str1 :=
str1 || 'sum(decode(' || i.column_name || ',null,1,0))' || trailer;
str2 := str2 || 'v' || LTRIM (cnt) || trailer;
str3 :=
str3
|| 'if v'
|| LTRIM (cnt)
|| ' = 0 then '
|| 'dbms_output.put_line(''alter table '
|| p_schema
|| '.'
|| i.table_name
|| ' modify ('
|| i.column_name
|| ' not null);''); end if;'
|| CHR (10);
IF i.column_name = i.lastcol
THEN
str2 := str2 || ' from ' || p_schema || '.' || i.table_name || ';';
str3 := str3 || ' end;';
do_sql (str0 || ' ' || str1 || ' ' || str2 || ' ' || str3);
END IF;
prev := i.table_name;
cnt := cnt + 1;
END LOOP;
END;
/
Wednesday, December 26, 2007
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment