-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsecciones-comunes.sql
202 lines (165 loc) · 6.36 KB
/
secciones-comunes.sql
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
-- Snippets de código a emplear en scripts de mantenimiento
DBMS_OUTPUT.DISABLE;
DBMS_OUTPUT.ENABLE(10000000);
--SERVEROUT[PUT] {OFF|ON} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]}]
------------------------------
-- Procedimientos y funciones
------------------------------
-- di ------------------------------------------------------------------------
PROCEDURE di( vcosa VARCHAR2 ) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(SUBSTR(vcosa, 1, 255) );
END di;
-- di ------------------------------------------------------------------------
PROCEDURE di( nTabulaciones NUMBER, vcosa VARCHAR2 ) IS
--------------
-- Constantes
--------------
CADENA_TAB CONSTANT VARCHAR2(2) := '..';
-------------
-- Variables
-------------
vCadenaTAB VARCHAR2(100);
BEGIN
FOR i IN 1..LEAST( nTabulaciones, 50 ) LOOP
vCadenaTAB := vCadenaTAB || CADENA_TAB;
END LOOP;
di( vCadenaTAB || vcosa );
END di;
-- diSeparador ---------------------------------------------------------------
PROCEDURE diSeparador IS
BEGIN
di( '===================================================================');
END diSeparador;
-- di ------------------------------------------------------------------------
PROCEDURE di( cBuffer CLOB, vCosa VARCHAR2 ) IS
BEGIN
DBMS_LOB.WRITEAPPEND( cBuffer,
LENGTH( vCosa || CHR(10) ),
vCosa || CHR(10) );
END di;
-- vEnmascarar ---------------------------------------------------------------
FUNCTION vEnmascarar( vCosa VARCHAR2 ) RETURN VARCHAR2 IS
-- Función para enmascarar palabras
BEGIN
RETURN REPLACE( vCosa, SUBSTR( vCosa, 1, 4), '****' );
END vEnmascarar;
-- diTiempo ------------------------------------------------------------------
PROCEDURE diTiempo ( nIni IN NUMBER,
nFin IN NUMBER,
vTexto IN VARCHAR2 := NULL )
IS
-- Para usar en conjunción con Dbms_Utility.Get_Time
BEGIN
di( vTexto ||
LPAD ( TO_CHAR ( ((nFin-nIni)/100), 9999.9 ), 15 ) ||
' Segundos' );
END diTiempo;
-- NVL con salida de log cuando hay sustitución
-- nvlLogeado (cadenas) ------------------------------------------------------
FUNCTION nvlLogeado(vCampo VARCHAR2,
vValorPrincipal VARCHAR2,
vValorSiNull VARCHAR2)
RETURN VARCHAR2 IS
-- Devuelve el NVL de las dos cadenas pasadas como parámetro.
-- En caso de que el valor principal sea nulo entonces loguea el cambio
vValorFinal VARCHAR2(4000);
BEGIN
vValorFinal := NVL(vValorPrincipal,vValorSiNull);
IF vValorPrincipal IS NULL AND vValorFinal IS NOT NULL THEN
di(vCampo || ' reemplazado por "' || vValorFinal || '"');
END IF;
RETURN vValorFinal;
END nvlLogeado;
-- nvlLogeado (números) ------------------------------------------------------
FUNCTION nvlLogeado(vCampo VARCHAR2,
nValorPrincipal NUMBER,
nValorSiNull NUMBER)
RETURN NUMBER IS
-- Devuelve el NVL de los dos números pasados como parámetro.
-- En caso de que el valor principal sea nulo entonces loguea el cambio
nValorFinal NUMBER;
BEGIN
nValorFinal := NVL(nValorPrincipal,nValorSiNull);
IF nValorPrincipal IS NULL AND nValorFinal IS NOT NULL THEN
di(vCampo || ' reemplazado por "' || nValorFinal || '"');
END IF;
RETURN nValorFinal;
END nvlLogeado;
-- nvlLogeado (fechas) ------------------------------------------------------
FUNCTION nvlLogeado(vCampo VARCHAR2,
dValorPrincipal DATE,
dValorSiNull DATE)
RETURN DATE IS
-- Devuelve el NVL de las dos fechas pasadas como parámetro.
-- En caso de que el valor principal sea nulo entonces loguea el cambio
dValorFinal DATE;
BEGIN
dValorFinal := NVL(dValorPrincipal,dValorSiNull);
IF dValorPrincipal IS NULL AND dValorFinal IS NOT NULL THEN
di(vCampo || ' reemplazado por "' || TO_CHAR(dValorFinal,'DD/MM/YYYY') || '"');
END IF;
RETURN dValorFinal;
END nvlLogeado;
-- Para crear el clob con ámbito sólo de la llamada
DBMS_LOB.CREATETEMPORARY( lob_loc => cSalida,
cache => TRUE,
dur => DBMS_LOB.CALL );
-- Para hacer el di usando un clob
VAR SPOL CLOB
SET LONG 100000000
SET PAGES 50000
SET LINESIZE 255
COLUMN SALIDA FORMAT A255
SELECT :SPOL AS SALIDA FROM DUAL;
-- Hacer un clob y meterle datos
DECLARE
cXML CLOB := EMPTY_CLOB;
BEGIN
Dbms_Lob.CreateTemporary( cXML, TRUE, Dbms_Lob.SESSION );
Dbms_Lob.Append( cXML, '<?xml');
END;
/
-- Lob_Replace
-- @link http://www.astral-consultancy.co.uk/cgi-bin/hunbug/doco.cgi?11080
FUNCTION dfn_clobReplace(
p_clob IN CLOB,
p_what IN VARCHAR2,
p_with IN VARCHAR2 )
RETURN CLOB IS
c_whatLen CONSTANT PLS_INTEGER := LENGTH(p_what);
c_withLen CONSTANT PLS_INTEGER := LENGTH(p_with);
l_return CLOB;
l_segment CLOB;
l_pos PLS_INTEGER := 1-c_withLen;
l_offset PLS_INTEGER := 1;
BEGIN
IF p_what IS NOT NULL THEN
WHILE l_offset < DBMS_LOB.GETLENGTH(p_clob) LOOP
l_segment := DBMS_LOB.SUBSTR(p_clob,32767,l_offset);
LOOP
l_pos := DBMS_LOB.INSTR(l_segment,p_what,l_pos+c_withLen);
EXIT WHEN (NVL(l_pos,0) = 0) OR (l_pos = 32767-c_withLen);
l_segment := TO_CLOB( DBMS_LOB.SUBSTR(l_segment,l_pos-1)
||p_with
||DBMS_LOB.SUBSTR(l_segment,32767-c_whatLen-l_pos-c_whatLen+1,l_pos+c_whatLen));
END LOOP;
l_return := l_return||l_segment;
l_offset := l_offset + 32767 - c_whatLen;
END LOOP;
END IF;
RETURN(l_return);
END dfn_clobReplace;
-------------------------------------------------------------------------------
TYPE tListaCodigos IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
-- Procedimiento addCodigo --------------------------------------------------
PROCEDURE addCodigo( rLista IN OUT tListaCodigos, vCodigo VARCHAR2 ) IS
-- Procedimiento que añade un código nuevo a una lista de códigos
-------------
-- Variables
-------------
nSiguiente BINARY_INTEGER;
BEGIN
nSiguiente := NVL( rLista.LAST, 0 ) + 1;
rLista( nSiguiente ) := vCodigo;
END addCodigo;