Oracle - Un trigger

 
Vista:

Un trigger

Publicado por Ferruti (2 intervenciones) el 28/09/2007 10:50:49
Saludos, estoy atascado con un trigger. Esto es lo que quiero que haga, y a ver si me podeis echar una mano.

Dada una cadena de caracteres, en los cuales vienen varios números, vease: "12,25;35,35;6,25;50,25" he de hacer un trigger para que en ese campo de la tabla, me ordene los números de mayor a menor.

El trigger que he realizado es el siguiente (aviso no he hecho un trigger en mi vida, por lo que era normal que me cascara):

TRIGGER CAMPO_BEFORE
BEFORE INSERT OR UPDATE ON TABLA
FOR EACH ROW
DECLARE
VAR VARCHAR2(254);
A VARCHAR2(60);
B VARCHAR2(60);
C VARCHAR2(60);
D VARCHAR2(60);

PIVOTE NUMBER (20,10);
CONTADOR INTEGER (2);
I INTEGER (4);
J INTEGER (4);
A1 NUMBER (20,10);
B1 NUMBER (20,10);
C1 NUMBER (20,10);
D1 NUMBER (20,10);

BEGIN
I:=0;
CONTADOR:=0;
PIVOTE:=0;

SELECT CAMPO
INTO VAR
FROM TABLA
J:=LEN(VAR);

WHILE VAR(I)<>";" OR I<J LOOP
A(I):=VAR(I);
I:=I+1;
CONTADOR:=1;
END LOOP;
IF VAR(I)=";" THEN
I:=I+1;
END IF;

WHILE I<J OR VAR(I)<>";" LOOP
B(I):=VAR(I);
I++;
CONTADOR:=2;
END LOOP;

IF VAR(I)=";" THEN
I:=I+1;
END IF;

WHILE I<J OR VAR(I)<>";" LOOP
C(I):=VAR(I);
I++;
CONTADOR:=3;
END LOOP;

IF VAR(I)=";" THEN
I:=I+1;
END IF;

WHILE I<J OR VAR(I)<>";" LOOP
D(I):=VAR(I);
I++;
CONTADOR:=4;
END LOOP;

IF VAR(I)="|" THEN
I:=I+1;
END IF;

WHILE I<J OR VAR(I)<>"|" LOOP
E(I):=VAR(I);
I++;
CONTADOR:=5;
END LOOP;

IF VAR(I)=";" THEN
I:=I+1;
END IF;

SELECT CASE (CONTADOR)

WHEN CONTADOR=1 THEN CAMPO:=VAR

WHEN CONTADOR=2 THEN
(A1:= CAST (A AS NUMBER);
B1:= CAST (B AS NUMBER);
IF B1>A1 THEN
PIVOTE:=B1;
B1:=A1;
A1:=PIVOTE;
END IF
A:= CAST (A1 AS VARCHAR2);
B:= CAST(B1 AS VARCHAR2);
VAR:=CONCAT(A,";",B);
CAMPO:=VAR;)

WHEN CONTADOR=3 THEN (
A1:= CAST (A AS NUMBER);
B1:=CAST(B AS NUMBER);
C1:=CAST(C AS NUMBER);
IF B1>A1 THEN
PIVOTE:=B1;
B1:=A1;
A1:=PIVOTE;
END IF;

IF C1>A1 THEN
PIVOTE:=C1;
C1:=A1;
A1:=PIVOTE;
END IF;

IF C1>B1 THEN
PIVOTE:=B1;
B1:=C1;
C1:=PIVOTE;
END IF;
A:=CAST(A1 AS VARCHAR2);
B:=CAST(B1 AS VARCHAR2);
C:=CAST(C1 AS VARCHAR2);
CAMPO:=CONCAT(A,";",B;";",C);)

WHEN CONTADOR=4 THEN (
A1:=CAST(A AS NUMBER);
B1:=CAST(B AS NUMBER);
C1:=CAST(C AS NUMBER);
D1:=CAST(D AS NUMBER);
IF B1>A1 THEN
PIVOTE:=B1;
B1:=A1;
A1:=PIVOTE;
END IF;

IF C1>A1 THEN
PIVOTE:=C1;
C1:=A1;
A1:=PIVOTE;
END IF;

IF D1>A1 THEN
PIVOTE:=D1;
D1:=A1;
A1:=PIVOTE;
END IF;

IF C1>B1 THEN
PIVOTE:=C1;
C1:=B1;
B1:=PIVOTE;
END IF;

IF D1>B1 THEN
PIVOTE:=D1;
D1:=B1;
B1:=PIVOTE;
END IF;

IF D1>C1 THEN
PIVOTE:=D1;
D1:=C1;
C1:=PIVOTE;
END IF;
A:=CAST(A1 AS VARCHAR2);
B:=CAST(B1 AS VARCHAR2);
C:=CAST(C1 AS VARCHAR2);
D:=CAST(D1 AS VARCHAR2);
CAMPO:=CONCAT(A,";",B;";",C,";",D);)

WHEN DEFAULT THEN :NEW (CAMPO:=VAR);
END;

Además el error que me ha dado es el siguiente:
ORA-04098: el disparador 'BD.CAMPO_BEFORE' no es válido y ha fallado al revalidar

¿Me podeis decir por favor que estoy haciendo mal? (No me digais todo, que me da algo, jejeje)

Un saludo y muchisimas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Un trigger

Publicado por Rodolfo Reyes (445 intervenciones) el 28/09/2007 17:10:18
Dentro de un trigger no puedes hacer un select, insert, delete o update sobre la misma tabla sobre la que estas creando el trigger.

Y si no entendi mal tu codigo, esta haciendo un query para obtener el valor del campo.

SELECT CAMPO
INTO VAR
FROM TABLA

Pero no necesitar hacer esto porque en :NEW.CAMPO tienes el valor que acaban de insertar o actualizar.

La idea de tu trigeer deberia de ser mas o menos así.

Create or Replace TRIGGER CAMPO_BEFORE
BEFORE INSERT OR UPDATE ON TABLA
FOR EACH ROW

DECLARE
temporal varchar2(4000);
.
.
.

Begin
temporal := :NEW.CAMPO;

/*
Aqui haces el proceso para ordenar el contenido de la variable temporal
*/

--Al final del trigger colocar la información ordenada en el campo :NEW.CAMPO
-- para que se guarde en la base de datos.
:NEW.CAMPO := temporal;

end;
/


Otra cosa, probablemente solo lo copiaste mal en el post. pero al inicio del trigger tienes que poner

Create or Replace TRIGGER CAMPO_BEFORE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Un trigger

Publicado por Ferruti (2 intervenciones) el 02/10/2007 11:13:25
Muchísimas gracias!!

Problema solucionado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Un trigger

Publicado por Lilita alejanda (2 intervenciones) el 23/02/2009 18:46:58
Yo tambien tengo el mismo problema pero yo lo sabo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Un trigger

Publicado por Lilita alejanda (2 intervenciones) el 23/02/2009 18:47:18
Yo tambien tengo el mismo problema pero yo no lo sabo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Un trigger

Publicado por Anonimus (1 intervención) el 28/01/2011 13:32:57
alter trigger BD.CAMPO_BEFORE disable;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar