-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfinal project.sql
66 lines (49 loc) · 1.44 KB
/
final project.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
DECLARE
CURSOR get_pk
IS
SELECT DISTINCT const.table_name, col.column_name, const.constraint_type, tab.data_type
FROM user_constraints const
JOIN user_cons_columns col
ON const.constraint_name = col.constraint_name
JOIN user_tab_columns tab
ON col.column_name = tab.column_name
WHERE const.constraint_type = 'P'
AND tab.data_type = 'NUMBER'
AND const.table_name IN
(SELECT OBJECT_NAME
FROM user_objects
WHERE OBJECT_TYPE ='TABLE');
CURSOR seq_check IS
SELECT sequence_name
FROM user_sequences;
seq_name varchar2(200);
seq_max number(10);
seq_beginning varchar2 (200);
trig_name varchar2(100);
BEGIN
FOR rec IN get_pk LOOP
seq_name :=rec.table_name||'_SEQ';
seq_beginning := 'SELECT NVL(MAX( '|| rec.column_name ||'), 0)+1 FROM ' ||rec.table_name;
EXECUTE IMMEDIATE seq_beginning into seq_max;
FOR dup IN seq_check LOOP
IF dup.sequence_name = seq_name THEN
EXECUTE IMMEDIATE 'DROP SEQUENCE '|| dup.sequence_name;
END IF;
END LOOP;
EXECUTE IMMEDIATE '
CREATE SEQUENCE '||seq_name||'
START WITH '|| seq_max||'
INCREMENT BY 1';
trig_name := rec.table_name||'_TRIG';
EXECUTE IMMEDIATE '
CREATE OR REPLACE TRIGGER '||trig_name||'
BEFORE INSERT
ON '||rec.table_name ||'
FOR EACH ROW
BEGIN
'||
':new.'|| rec.column_name ||':= '||seq_name||'.nextval;
END; ';
END LOOP;
END;
show errors