clicksor ad

Thursday, July 08, 2010

Script to generate Foreign keys

SET termout OFF
SET feedback OFF
SET lines 120
SET serveroutput ON SIZE 1000000
SPOOL C:\crt_fk.SQL
DECLARE
v_virg VARCHAR2 (1);
v_maxcol NUMBER;
v_tname VARCHAR2 (30);
v_string1 VARCHAR2 (2000);
v_string2 VARCHAR2 (2000);
CURSOR c1 IS
SELECT table_name
FROM user_tables
ORDER BY table_name ASC;

BEGIN
DBMS_OUTPUT.put_line ('--');
DBMS_OUTPUT.put_line ('-- FOREIGN KEYS --');
DBMS_OUTPUT.put_line ('--');
FOR i IN c1
LOOP
v_string1 := NULL;
v_string2 := NULL;
FOR rcn IN (SELECT table_name, constraint_name, r_constraint_name
FROM user_constraints
WHERE constraint_type = 'R'
AND table_name = i.table_name
ORDER BY table_name)
LOOP
DBMS_OUTPUT.put_line ('ALTER TABLE ' || rcn.table_name);
v_string1 := 'ADD CONSTRAINT ' || rcn.constraint_name || ' FOREIGN KEY (';
v_virg := ',';
FOR rcl IN (SELECT column_name, position
FROM user_cons_columns
WHERE constraint_name = rcn.constraint_name
ORDER BY position)
LOOP
SELECT MAX (position)
INTO v_maxcol
FROM user_cons_columns c
WHERE c.constraint_name = rcn.constraint_name;
IF rcl.POSITION = v_maxcol THEN
v_virg := '';
END IF;
v_string1 := v_string1 || rcl.column_name || v_virg;
END LOOP;
DBMS_OUTPUT.put_line (v_string1 || ')');
SELECT table_name
INTO v_tname
FROM user_constraints
WHERE constraint_name = rcn.r_constraint_name;
v_string2 := 'REFERENCES ' || v_tname || ' (';
SELECT MAX (position)
INTO v_maxcol
FROM user_cons_columns
WHERE constraint_name = rcn.r_constraint_name;
v_virg := ',';
SELECT MAX (position)
INTO v_maxcol
FROM user_cons_columns
WHERE constraint_name = rcn.r_constraint_name;
FOR rcr IN (SELECT column_name, position
FROM user_cons_columns
WHERE constraint_name = rcn.r_constraint_name
ORDER BY POSITION)
LOOP
IF rcr.position = v_maxcol THEN
v_virg := '';
END IF;
v_string2 := v_string2 || rcr.column_name || v_virg;
END LOOP;
DBMS_OUTPUT.put_line (v_string2 || ')');
DBMS_OUTPUT.put_line ('/');
DBMS_OUTPUT.put_line (CHR (10));
END LOOP;
END LOOP;
END;
/
SPOOL OFF;

No comments: