forked from KenRoytman/utPLSQL
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstr2list.pkg
executable file
·215 lines (203 loc) · 5.88 KB
/
str2list.pkg
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
CREATE OR REPLACE PACKAGE str2list
IS
PROCEDURE parse (
str IN VARCHAR2,
delim IN VARCHAR2,
pkg IN VARCHAR2,
tab IN VARCHAR2,
datatype IN VARCHAR2 := 'VARCHAR2(32767)',
extend_needed BOOLEAN := FALSE
);
PROCEDURE parse (
str IN VARCHAR2,
delim IN VARCHAR2,
pkg IN VARCHAR2,
appendproc IN VARCHAR2, /* pkg.appendproc (oneval); */
deleteproc IN VARCHAR2, /* pkg.deleteproc (onerow); or pkg.deleteproc; */
datatype IN VARCHAR2
);
PROCEDURE showlist (
pkg IN VARCHAR2,
tab IN VARCHAR2
);
PROCEDURE showlist (
pkg IN VARCHAR2,
firstrowproc IN VARCHAR2,
nextrowproc IN VARCHAR2,
getvalfunc IN VARCHAR2,
showproc IN VARCHAR2 := 'DBMS_OUTPUT.PUT_LINE',
datatype IN VARCHAR2 := 'VARCHAR2(32767)'
);
END str2list;
/
CREATE OR REPLACE PACKAGE BODY str2list
IS
procedure disperr (str in varchar2) is
begin
p.l ('Compilation/Execution Error:');
p.l (SQLERRM);
p.l ('In:');
p.l (str);
end;
PROCEDURE parse (
str IN VARCHAR2,
delim IN VARCHAR2,
pkg IN VARCHAR2,
tab IN VARCHAR2,
datatype IN VARCHAR2 := 'VARCHAR2(32767)',
extend_needed BOOLEAN := FALSE
)
IS
tabname VARCHAR2 (100) := pkg || '.' || tab;
dynblock VARCHAR2 (32767);
extstring VARCHAR2 (100);
BEGIN
IF extend_needed
THEN
extstring := tabname || '.EXTEND;'
END IF;
dynblock :=
'DECLARE
v_loc PLS_INTEGER;
v_startloc PLS_INTEGER := 1;
v_item ' || datatype || ';
BEGIN ' ||
tabname || '.DELETE;
IF :str IS NOT NULL
THEN
LOOP
v_loc := INSTR (:str, :delim, v_startloc);
IF v_loc = v_startloc
THEN
v_item := NULL;
ELSIF v_loc = 0
THEN
v_item := SUBSTR (:str, v_startloc);
ELSE
v_item := SUBSTR (:str, v_startloc, v_loc - v_startloc);
END IF;' ||
extstring || tabname || '(' || tabname || '.LAST)
:= v_item;
IF v_loc = 0
THEN
EXIT;
ELSE
v_startloc := v_loc + 1;
END IF;
END LOOP;
END IF;
END;';
EXECUTE IMMEDIATE dynblock USING str, delim;
EXCEPTION
WHEN OTHERS
THEN
disperr (dynblock);
END;
PROCEDURE parse (
str IN VARCHAR2,
delim IN VARCHAR2,
pkg IN VARCHAR2,
appendproc IN VARCHAR2,
deleteproc IN VARCHAR2,
datatype IN VARCHAR2
)IS
dynblock VARCHAR2 (32767);
BEGIN
dynblock :=
'DECLARE
v_loc PLS_INTEGER;
v_startloc PLS_INTEGER := 1;
v_item ' || datatype || ';
BEGIN
' || pkg || '.' || deleteproc || ';
IF :str IS NOT NULL
THEN
LOOP
v_loc := INSTR (:str, :delim, v_startloc);
IF v_loc = v_startloc
THEN
v_item := NULL;
ELSIF v_loc = 0
THEN
v_item := SUBSTR (:str, v_startloc);
ELSE
v_item := SUBSTR (:str, v_startloc, v_loc - v_startloc);
END IF;' ||
pkg ||
'.' ||
appendproc ||
'( v_item);
IF v_loc = 0
THEN
EXIT;
ELSE
v_startloc := v_loc + 1;
END IF;
END LOOP;
END IF;
END;';
EXECUTE IMMEDIATE dynblock USING str, delim;
EXCEPTioN
when others then disperr (dynblock);
END;
PROCEDURE showlist (
pkg IN VARCHAR2,
tab IN VARCHAR2
)
IS
tabname VARCHAR2 (100) := pkg || '.' || tab;
dynblock VARCHAR2 (32767);
BEGIN
dynblock :=
'DECLARE
indx PLS_INTEGER := ' || tabname ||
'.FIRST;
v_startloc PLS_INTEGER := 1;
v_item VARCHAR2(32767);
BEGIN
LOOP
EXIT WHEN indx IS NULL;
DBMS_OUTPUT.PUT_LINE (' ||
tabname ||
'(indx));
indx := ' ||
tabname ||
'.NEXT (indx);
END LOOP;
END;';
EXECUTE IMMEDIATE dynblock;
EXCEPTioN
when others then disperr (dynblock);
END;
PROCEDURE showlist (
pkg IN VARCHAR2,
firstrowproc IN VARCHAR2,
nextrowproc IN VARCHAR2,
getvalfunc IN VARCHAR2,
showproc IN VARCHAR2 := 'DBMS_OUTPUT.PUT_LINE',
datatype IN VARCHAR2 := 'VARCHAR2(32767)' )
IS
dynblock VARCHAR2 (32767);
BEGIN
dynblock :=
'DECLARE
indx PLS_INTEGER := ' || pkg ||
'.' || firstrowproc || ';
v_startloc PLS_INTEGER := 1;
v_item ' || datatype || ';
BEGIN
LOOP
EXIT WHEN indx IS NULL;' ||
showproc || ' (' ||
pkg || '.' || getvalfunc || '(indx));
indx := ' ||
pkg ||
'.' || nextrowproc || '(indx);
END LOOP;
END;';
EXECUTE IMMEDIATE dynblock;
EXCEPTioN
when others then disperr (dynblock);
END;
END str2list;
/