DBA Data[Home] [Help]

PACKAGE BODY: APPS.CCT_CHECK_SEQ_PKG

Source


1 PACKAGE BODY cct_check_seq_pkg AS
2 /* $Header: cctcksqb.pls 120.0.12010000.1 2008/07/25 23:41:46 appldev ship $ */
3 
4 
5 -- Check whether the current value of the sequence number is less than the max of
6 -- the column from the table.
7 -- If the sequence number is bigger, then do nothing.
8 -- Otherwise, recreate the sequence with the max of the column from the table
9 
10    PROCEDURE check_sequence  (
11         table_name      IN VARCHAR2,
12         column_name     IN VARCHAR2,
13 		sequence_name   IN VARCHAR2,
14         cct_schema      IN VARCHAR2
15          ) IS
16 
17     sequence_not_found exception;
18     pragma exception_init(sequence_not_found, -942);
19 	l_missing_sequence VARCHAR2(2000);
20 
21 	v_cursorID INTEGER;
22 	v_seq_stmt VARCHAR2(2000);
23 	l_seq_val VARCHAR2(10);
24 	v_dummy INTEGER;
25 
26 	v_cursorID1 INTEGER;
27 	v_max_stmt VARCHAR2(2000);
28 	l_max_val VARCHAR2(10);
29 	v_dummy1 INTEGER;
30 
31     v_create_tbl_stmt VARCHAR2(2000);
32     v_drop_tbl_stmt VARCHAR2(2000);
33     v_inc_stmt VARCHAR2(2000);
34     v_ins_stmt VARCHAR2(2000);
35 
36     v_new_begin INTEGER;
37     diff INTEGER;
38     l_num NUMBER;
39 
40    BEGIN
41 	 SAVEPOINT CCTCKSEQ;
42 
43 	 -- Getting the current Sequence value
44 	 BEGIN
45 
46      	  v_cursorID:=DBMS_SQL.OPEN_CURSOR;
47      	  v_seq_stmt:='SELECT '||cct_schema||'.'||sequence_name||'.NEXTVAL from dual';
48           --dbms_output.put_line(v_seq_stmt);
49 	      DBMS_SQL.PARSE(v_cursorID,v_seq_stmt,DBMS_SQL.V7);
50           --dbms_output.put_line('after parsing');
51 	      DBMS_SQL.DEFINE_COLUMN(v_cursorID,1,l_seq_val,10);
52           --dbms_output.put_line('after define column');
53 	      v_dummy:=DBMS_SQL.EXECUTE(v_cursorID);
54            --dbms_output.put_line('after execute 1');
55 	      Loop
56 	        if DBMS_SQL.FETCH_ROWS(v_cursorID)=0 THEN
57             --dbms_output.put_line('exiting');
58 		    exit;
59             end if;
60             --dbms_output.put_line('before col valu');
61             DBMS_SQL.COLUMN_VALUE(v_cursorID,1,l_seq_val);
62             --dbms_output.put_line(l_seq_val);
63           END LOOP;
64 	      DBMS_SQL.CLOSE_CURSOR(v_cursorID);
65      Exception
66 		 When others then
67 			l_missing_sequence:=sequence_name;
68 			raise sequence_not_found;
69      end;
70 
71      -- Getting the max column value from the table
72 	 BEGIN
73      	 v_cursorID1:=DBMS_SQL.OPEN_CURSOR;
74      	 v_max_stmt:='SELECT max('||column_name||') from '||cct_schema||'.'||table_name;
75          --dbms_output.put_line(v_max_stmt);
76 	     DBMS_SQL.PARSE(v_cursorID1,v_max_stmt,DBMS_SQL.V7);
77          --dbms_output.put_line('after parsing');
78 	     DBMS_SQL.DEFINE_COLUMN(v_cursorID1,1,l_max_val,10);
79          --dbms_output.put_line('after define column');
80 	     v_dummy1:=DBMS_SQL.EXECUTE(v_cursorID1);
81          --dbms_output.put_line('after execute 2');
82 	     Loop
83 	       if DBMS_SQL.FETCH_ROWS(v_cursorID1)=0 THEN
84            --dbms_output.put_line('exiting');
85 		     exit;
86            end if;
87            --dbms_output.put_line('before col valu');
88            DBMS_SQL.COLUMN_VALUE(v_cursorID1,1,l_max_val);
89            --dbms_output.put_line(l_max_val);
90          END LOOP;
91 	     DBMS_SQL.CLOSE_CURSOR(v_cursorID1);
92      Exception
93 		 When others then
94 		    raise_application_error(-20000, 'Column '||table_name||':'||column_name||' SQLERRM::'||sqlerrm || '. Could not get the max value.');
95      end;
96 
97      -- if the sequence value is less than the max column value then bump up the sequence to
98      -- max column value, otherwise do nothing
99      -- dbms_output.put_line('Sequence='||l_seq_val||', max column='||l_max_val);
100 
101      if (to_number(l_seq_val) <= to_number(l_max_val) )
102      then
103          begin
104 
105              v_new_begin := to_number(l_max_val)+1;
106              diff := to_number(l_max_val) - to_number(l_seq_val) + 1;
107              --dbms_output.put_line('diff is '||diff);
108          end;
109 
110          begin
111              v_inc_stmt:='alter SEQUENCE '||cct_schema||'.'||sequence_name||' INCREMENT BY '||diff;
112              --dbms_output.put_line('Increase Sequence stmt='||v_inc_stmt);
113              EXECUTE IMMEDIATE v_inc_stmt;
114 
115              EXECUTE IMMEDIATE 'select ' || cct_schema||'.'||sequence_name || '.nextval from dual where rownum=1 ' INTO l_num;
116 --             dbms_output.put_line('Increase Sequence value='||l_num);
117              v_inc_stmt:='alter SEQUENCE '||cct_schema||'.'||sequence_name||' INCREMENT BY 1';
118              --dbms_output.put_line('Increase Sequence stmt='||v_inc_stmt);
119              EXECUTE IMMEDIATE v_inc_stmt;
120 
121          Exception
122              When others then
123                  l_missing_sequence:=sequence_name;
124                  raise sequence_not_found;
125          end;
126 
127 	 END IF;
128 
129      COMMIT WORK;
130 
131      EXCEPTION
132          WHEN sequence_not_found THEN
133              ROLLBACK TO SAVEPOINT CCTCKSEQ;
134              raise_application_error(-20000, 'Sequence '||l_missing_sequence||' not found') ;
135 
136 
137          WHEN OTHERS THEN
138              ROLLBACK TO SAVEPOINT CCTCKSEQ;
139              raise_application_error(-20000, sqlerrm || '. Could not modify sequence')  ;
140    END check_sequence;
141 
142 
143 END cct_check_seq_pkg;