forked from KenRoytman/utPLSQL
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilepath2.pkg
executable file
·177 lines (147 loc) · 3.66 KB
/
filepath2.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
/* Formatted by PL/Formatter v3.1.2.1 on 2000/09/16 06:52 */
CREATE OR REPLACE PACKAGE fileio
IS
c_delim CHAR (1) := ';';
TYPE dirs_ibtabtype IS TABLE OF VARCHAR2 (2000)
INDEX BY BINARY_INTEGER;
PROCEDURE setpath (str IN VARCHAR2, delim IN VARCHAR2 := c_delim);
FUNCTION path
RETURN VARCHAR2;
FUNCTION pathlist
RETURN dirs_ibtabtype;
PROCEDURE append (onedir IN VARCHAR2);
PROCEDURE delete (rowindex IN PLS_INTEGER := NULL);
FUNCTION COUNT
RETURN PLS_INTEGER;
FUNCTION FIRST
RETURN PLS_INTEGER;
FUNCTION LAST
RETURN PLS_INTEGER;
FUNCTION NEXT (rowindex IN PLS_INTEGER := NULL)
RETURN PLS_INTEGER;
FUNCTION nthval (rowindex IN PLS_INTEGER := NULL)
RETURN VARCHAR2;
FUNCTION open (file IN VARCHAR2, loc IN VARCHAR2 := NULL)
RETURN UTL_FILE.file_type;
END;
/
CREATE OR REPLACE PACKAGE BODY fileio
IS
g_path VARCHAR2 (32767);
g_delim CHAR (1) := c_delim;
dirs dirs_ibtabtype;
PROCEDURE setpath (str IN VARCHAR2, delim IN VARCHAR2 := c_delim)
IS
BEGIN
g_path := str;
g_delim := NVL (delim, c_delim);
str2list.parse (str, g_delim, 'fileIO', 'append', 'delete', 'VARCHAR2(32767)');
END;
PROCEDURE append (onedir IN VARCHAR2)
IS
BEGIN
dirs (NVL (dirs.LAST, 0) + 1) := onedir;
END;
PROCEDURE delete (rowindex IN PLS_INTEGER := NULL)
IS
BEGIN
IF rowindex IS NULL
THEN
dirs.delete;
ELSE
dirs.delete (rowindex);
END IF;
END;
FUNCTION COUNT
RETURN PLS_INTEGER
IS
BEGIN
RETURN dirs.COUNT;
END;
FUNCTION FIRST
RETURN PLS_INTEGER
IS
BEGIN
RETURN dirs.FIRST;
END;
FUNCTION LAST
RETURN PLS_INTEGER
IS
BEGIN
RETURN dirs.FIRST;
END;
FUNCTION NEXT (rowindex IN PLS_INTEGER := NULL)
RETURN PLS_INTEGER
IS
BEGIN
RETURN dirs.NEXT (rowindex);
END;
FUNCTION nthval (rowindex IN PLS_INTEGER := NULL)
RETURN VARCHAR2
IS
BEGIN
RETURN dirs (rowindex);
END;
FUNCTION path
RETURN VARCHAR2
IS
BEGIN
RETURN g_path;
END;
FUNCTION pathlist
RETURN dirs_ibtabtype
IS
BEGIN
RETURN dirs;
END;
FUNCTION open (file IN VARCHAR2, loc IN VARCHAR2 := NULL)
RETURN UTL_FILE.file_type
IS
indx PLS_INTEGER;
/* Location of next path separator */
v_lastsep PLS_INTEGER := 1;
v_sep PLS_INTEGER := INSTR (g_path, c_delim);
v_dir VARCHAR2 (500);
retval UTL_FILE.file_type;
PROCEDURE set_next_dir
IS
BEGIN
v_sep := INSTR (g_path, c_delim, v_sep + 1);
IF v_sep = 0
THEN
v_dir := SUBSTR (g_path, v_lastsep);
ELSE
v_dir := SUBSTR (g_path, v_lastsep, v_sep - v_lastsep);
END IF;
END;
BEGIN
IF loc IS NOT NULL
THEN
indx := NULL;
v_dir := loc;
ELSE
indx := dirs.FIRST;
v_dir := dirs (indx);
END IF;
WHILE v_dir IS NOT NULL
LOOP
BEGIN
--DBMS_OUTPUT.PUT_LINE ('...looking in ' || v_dir);
retval := UTL_FILE.fopen (v_dir, file, 'R');
EXIT;
EXCEPTION
WHEN OTHERS
THEN
indx := dirs.NEXT (indx);
IF indx IS NULL
THEN
v_dir := NULL;
ELSE
v_dir := dirs (indx);
END IF;
END;
END LOOP;
RETURN retval;
END;
END;
/