1 PACKAGE BODY IGS_RU_VAL_RUD AS
2 /* $Header: IGSRU08B.pls 115.6 2002/11/29 03:40:14 nsidana ship $ */
3
4 /*
5 Routine to clear rowids saved in a PL/SQL TABLE from a prior commit.
6
7 Validate the new IGS_RU_RULE description, compared with old
8 */
9 FUNCTION RULP_VAL_RUD_DESC(
10 p_old_sequence_number IN NUMBER ,
11 p_old_return_type IN VARCHAR2 ,
12 p_old_rule_description IN VARCHAR2 ,
13 p_old_turing_function IN VARCHAR2 ,
14 p_new_return_type IN VARCHAR2 ,
15 p_new_rule_description IN VARCHAR2 ,
16 p_message_name OUT NOCOPY VARCHAR2 )
17 RETURN boolean IS
18 /*
19 STRUCTURES
20 */
21 TYPE t_param_list IS TABLE OF
22 IGS_RU_RET_TYPE.s_return_type%TYPE
23 INDEX BY BINARY_INTEGER;
24 /*
25
26 GLOBALS
27
28 list of parameter return types
29 */
30 gt_param_list t_param_list;
31 gv_params NUMBER;
32 /*
33
34 convert the description string into token, action
35 string, action, remainder of description
36 string, NULL, NULL
37 NULL, action, remainder of description
38
39 return FALSE if description is NULL and error
40
41 */
42 FUNCTION breakdown_desc (
43 p_string IN OUT NOCOPY IGS_RU_DESCRIPTION.rule_description%TYPE,
44 p_action IN OUT NOCOPY IGS_RU_DESCRIPTION.s_return_type%TYPE,
45 p_description IN OUT NOCOPY IGS_RU_DESCRIPTION.rule_description%TYPE )
46 RETURN BOOLEAN IS
47 BEGIN DECLARE
48 v_hash NUMBER;
49 BEGIN
50 /*
51 check if more to process
52 */
53 IF p_description IS NULL
54 THEN
55 RETURN FALSE;
56 END IF;
57 p_action := NULL;
58 v_hash := INSTR(p_description, '#');
59 p_string := SUBSTR(p_description,1,v_hash - 1);
60 IF v_hash = 0
61 THEN
62 p_action := '';
63 p_string := p_description;
64 ELSE
65 FOR return_types IN (
66 SELECT s_return_type
67 FROM IGS_RU_RET_TYPE
68 WHERE s_return_type LIKE SUBSTR(p_description,v_hash + 1,1)||'%'
69 ORDER BY s_return_type DESC )
70 LOOP
71 IF SUBSTR(p_description,v_hash + 1,LENGTH(return_types.s_return_type))
72 = return_types.s_return_type
73 THEN
74 p_action := return_types.s_return_type;
75 exit;
76 END IF;
77 END LOOP;
78 IF p_action IS NULL
79 THEN
80 /*
81 there must be an action following the #
82 */
83 RETURN FALSE;
84 END IF;
85 END IF;
86 p_description := SUBSTR(p_description,v_hash + 1 + LENGTH(p_action));
87 RETURN TRUE;
88 END;
89 END breakdown_desc;
90 /*
91
92 validate and save parameter order/type/number of new IGS_RU_RULE description
93
94 */
95 FUNCTION validate_desc (
96 p_rule_description IGS_RU_DESCRIPTION.rule_description%TYPE )
97 RETURN BOOLEAN IS
98 v_rule_description IGS_RU_DESCRIPTION.rule_description%TYPE;
99 v_string IGS_RU_DESCRIPTION.rule_description%TYPE;
100 v_action IGS_RU_RET_TYPE.s_return_type%TYPE;
101 BEGIN
102 gv_params := 0;
103 v_rule_description := p_rule_description;
104 WHILE v_rule_description IS NOT NULL
105 LOOP
106 IF breakdown_desc(v_string,v_action,v_rule_description) = FALSE
107 THEN
108 RETURN FALSE;
109 END IF;
110 IF v_action IS NOT NULL
111 THEN
112 gv_params := gv_params + 1;
113 gt_param_list(gv_params) := v_action;
114 END IF;
115 END LOOP;
116 RETURN TRUE;
117 END validate_desc;
118 /*
119
120 validate parameter order and number (old vs new)
121
122 */
123 FUNCTION validate_params (
124 p_rule_description IGS_RU_DESCRIPTION.rule_description%TYPE,
125 p_message_name OUT NOCOPY VARCHAR2 )
126 RETURN BOOLEAN IS
127 v_rule_description IGS_RU_DESCRIPTION.rule_description%TYPE;
128 v_string IGS_RU_DESCRIPTION.rule_description%TYPE;
129 v_action IGS_RU_RET_TYPE.s_return_type%TYPE;
130 v_params NUMBER;
131 BEGIN
132 v_params := 0;
133 v_rule_description := p_rule_description;
134 WHILE v_rule_description IS NOT NULL
135 LOOP
136 IF breakdown_desc(v_string,v_action,v_rule_description) = FALSE
137 THEN
138 /*
139 invalid old IGS_RU_RULE description (should not occur)
140 */
141 p_message_name := 'IGS_GE_INVALID_VALUE';
142 RETURN FALSE;
143 END IF;
144 IF v_action IS NOT NULL
145 THEN
146 v_params := v_params + 1;
147 IF v_params > gv_params
148 THEN
149 /*
150 more old parameters
151 */
152 p_message_name := 'IGS_GE_INVALID_VALUE';
153 RETURN FALSE;
154 END IF;
155 IF v_action <> gt_param_list(v_params)
156 THEN
157 /*
158 different parameter order
159 */
160 p_message_name := 'IGS_GE_INVALID_VALUE';
161 RETURN FALSE;
162 END IF;
163 END IF;
164 END LOOP;
165 IF v_params < gv_params
166 THEN
167 /*
168 more new parameters
169 */
170 p_message_name := 'IGS_GE_INVALID_VALUE';
171 RETURN FALSE;
172 END IF;
173 RETURN TRUE;
174 END validate_params;
175 /*
176
177 validate new description
178 if description in use validate number/type/order of paramters
179
180 */
181 BEGIN DECLARE
182 v_turing_count NUMBER := 0;
183 v_nr_count NUMBER := 0;
184 BEGIN
185 /*
186 validate new description
187 */
188 IF validate_desc(p_new_rule_description) = FALSE
189 THEN
190 p_message_name := 'IGS_GE_INVALID_VALUE';
191 RETURN FALSE;
192 END IF;
193 IF p_old_return_type IS NOT NULL AND
194 (p_old_return_type <> p_new_return_type OR
195 p_old_rule_description <> p_new_rule_description)
196 THEN
197 /*
198 UPDATING
199 */
200 IF p_old_turing_function IS NOT NULL
201 THEN
202 SELECT COUNT(*)
203 INTO v_turing_count
204 FROM IGS_RU_ITEM
205 WHERE turin_function = p_old_turing_function;
206 ELSE
207 SELECT COUNT(*)
208 INTO v_nr_count
209 FROM IGS_RU_NAMED_RULE nr,
210 IGS_RU_ITEM rui
211 WHERE nr.rud_sequence_number = p_old_sequence_number
212 AND rui.named_rule = nr.rul_sequence_number;
213 END IF;
214 IF v_turing_count > 0 OR
215 v_nr_count > 0
216 THEN
217 /*
218 IGS_RU_DESCRIPTION has been used
219 no change to return type
220 */
221 IF p_old_return_type <> p_new_return_type
222 THEN
223 p_message_name := 'IGS_GE_INVALID_VALUE';
224 RETURN FALSE;
225 END IF;
226 /*
227 parameter order/number must be same
228 */
229 IF validate_params(p_old_rule_description,
230 p_message_name) = FALSE
231 THEN
232 RETURN FALSE;
233 END IF;
234 END IF;
235 END IF;
236 RETURN TRUE;
237 END;
238 END rulp_val_rud_desc;
239
240 END IGS_RU_VAL_RUD;