¿Por qué mi procedimiento almacenado elimina los datos?
Publicado por Lena (15 intervenciones) el 06/10/2015 01:06:25
¿Por qué mi procedimiento almacenado elimina los datos?
Estoy haciendo un procedimiento almacenado que elimine los números de un empleado dado de baja de una tabla que contiene un campo "S_valor", un ejemplo sería:
1,2,54,289,86,30,476,268,285,259,224,719,801 --el 30 y el 801 ya fueron dados de baja
Pero al ejecutarlo, en lugar de eliminar el 801 o el 30, me elimina todo el campo!
si cambio el commit de lugar, me manda "recuperación fuera de secuencia"
Agradezco cualquier pista
Anexo el código completo:
Estoy haciendo un procedimiento almacenado que elimine los números de un empleado dado de baja de una tabla que contiene un campo "S_valor", un ejemplo sería:
1,2,54,289,86,30,476,268,285,259,224,719,801 --el 30 y el 801 ya fueron dados de baja
Pero al ejecutarlo, en lugar de eliminar el 801 o el 30, me elimina todo el campo!
si cambio el commit de lugar, me manda "recuperación fuera de secuencia"
Agradezco cualquier pista
Anexo el código completo:
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
CREATE OR REPLACE PROCEDURE SP_AFTER_ESTATUS_BAJA
--Este procedimiento almacenado elimina de la tabla aplicaciones a los empleados que ya fueron dados de baja
--(estatus 9 en c_personal)
IS
BEGIN
dbms_output.enable;
DBMS_OUTPUT.ENABLE(10000000);
DECLARE
CURSOR cur_TraeIdEmpleadoBaja
IS
SELECT n_id_personal
FROM esquema.PERSONAL
WHERE n_id_estatus = 9;
ORDER BY 1 asc;
v_baja cur_TraeIdEmpleadoBaja%rowtype;
CURSOR cur_aplicaciones
IS
SELECT s_valor
FROM esquema.aplicaciones
WHERE REGEXP_LIKE(esquema.aplicaciones.s_valor,('^(' || v_baja.n_id_personal || '),|,(' || v_baja.n_id_personal || '),|,(' || v_baja.n_id_personal || ')$|^(' || v_baja.n_id_personal || ')$'))
FOR UPDATE;
s_valor aplicaciones.s_valor%TYPE;
v_registro cur_aplicaciones%rowtype;
BEGIN
OPEN cur_TraeIdEmpleadoBaja;
LOOP
FETCH cur_TraeIdEmpleadoBaja INTO v_baja;
EXIT WHEN cur_TraeIdEmpleadoBaja%notfound;
dbms_output.put_line ('Id personal baja'|| v_baja.n_id_personal);
BEGIN --CUR APLICACIONES
OPEN cur_aplicaciones;
LOOP
UPDATE esquema.aplicaciones
SET s_valor = REGEXP_REPLACE (v_registro.s_valor,('^(' || v_baja.n_id_personal || '),|,(' || v_baja.n_id_personal || ')$|^(' || v_baja.n_id_personal || ')$'),'')
WHERE REGEXP_LIKE(v_registro.s_valor, ('^(' || v_baja.n_id_personal || '),|,(' || v_baja.n_id_personal || ')$|^(' || v_baja.n_id_personal || ')$'));
--Elimina el id que se encuentre al inicio del registro, al final del registro o que sea el único valor en el registro
UPDATE esquema.aplicaciones
SET s_valor = REGEXP_REPLACE (esquema.aplicaciones.s_valor, ',(' || v_registro.s_valor || '),',',')
WHERE REGEXP_LIKE(esquema.aplicaciones.s_valor, ',(' || v_registro.s_valor || '),');
--Elimina el id que se encuentre en el medio del registro, rodeado por comas */
FETCH cur_aplicaciones INTO v_registro;
EXIT WHEN cur_aplicaciones%notfound;
dbms_output.put_line (' Actualicé '|| v_registro.s_valor);
END LOOP; --aplicaciones
END cur_aplicaciones;
CLOSE cur_aplicaciones;
COMMIT;
END LOOP; --trae id empleado baja
CLOSE cur_TraeIdEmpleadoBaja;
END cur_TraeIdEmpleadoBaja;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line (SQLERRM);
ROLLBACK;
END SP_AFTER_ESTATUS_BAJA;
/
Valora esta pregunta


0