DBA Data[Home] [Help]

PACKAGE BODY: APPS.IGS_RU_VAL_RUD

Source


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;