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!
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


0