PDA

Ver la Versiσn Completa : ERROR ORA-04082: referencias NEW u OLD no permitidas en disparadores a nivel de tabla


Jose Manuel
05-05-2003, 07:11:45
Hola, estoy empezando a trabajar con ORACLE 9i con Delphi6, y tengo un problema para crear un trigger, pues me da el siguiente error:


ejemplo:
CREATE OR REPLACE TRIGGER "JM"."GENERAR_NUM_ORDEN"
BEFORE INSERT ON "LIQUIDA"
begin
if :new.num_orden is null then
:new.num_orden := LIQUIDA_NUM_ORDEN.nextval;
end if;
end;


el error es:
ORA-04082: referencias NEW u OLD no permitidas en disparadores a nivel de tabla

he hecho otras pruebas, pero siempre obtengo el mismo error de "NEW u OLD..."

Estoy intentando crear un contador en una tabla, que incremente un numero cada vez que se inserte un registro. He visto las "sequences" y me ha funcionado bien, pero me ha dejado algunos numeros en blanco.

Un saludo a todos.
Jose Manuel

jachguate
07-05-2003, 03:12:48
lo que ocurre es que oracle, por defecto, crea triggers por lotes, es decir, que el trigger se dispararα una sola vez por cada operaciσn update o insert sin importar cuantos registros se han afectado.

Supongo que no es lo que queres, por lo que debieras utilizar la sintaxis:

CREATE OR REPLACE TRIGGER "JM"."GENERAR_NUM_ORDEN"
BEFORE INSERT ON "LIQUIDA"
for each row
begin
if :new.num_orden is null then
:new.num_orden := LIQUIDA_NUM_ORDEN.nextval;
end if;
end;


Hasta luego.

Jose Manuel
07-05-2003, 18:29:47
Gracias por la ayuda, efectivamente se trataba de incluir la sentencia FOR EACH ROW, pero una vez puesta me daba otro error, que he corregido leyendo un articulo de la "Cara Oculta de Delphi6 , pag. 313), pues yo queria crear un Disparador que activase una Sequence, con el objeto de crear un contador que no permita saltos entre numeros.

EJEMPLO DE UN DISPARADOR, (obtenido de la cara oculta delphi 6, pag. 313):

CREATE OR REPLACE TRIGGER "JM."GENERAR_NUM_ORDEN"
BEFORE INSERT OR UPDATE OF "NUM_ORDEN" ON "LIQUIDA"
FOR EACH ROW
begin
if :new.num_orden is null then
select LIQUIDA_NUM_ORDEN.NextVal
into :new.num_orden
from Dual;
end if;
end;


EJEMPLO DE UNA SECUENCIA:

CREATE SEQUENCE "JM"."LIQUIDA_NUM_ORDEN" INCREMENT BY 1
START WITH 5000 MAXVALUE 99999 MINVALUE 1 NOCYCLE
NOCACHE ORDER


Saludos a todos
Jose Manuel


……………………………………………………………………………………………………..

marroquinlf
25-08-2007, 20:07:54
Saludos,
Ya que tienes el libro de cara oculta delphi 6, podrias proporcionarme una copia digital para poder leerlo.
Gracias.

jachguate
27-08-2007, 16:07:20
Ian Marteens (http://www.marteens.com), autor del libro, ofrece en su propia página la versión "digital" de La cara oculta de delphi (http://www.marteens.com/caraoculta.htm), pero no el 6, sino el 4.

Del 6 está disponible, si no mal recuerdo, solamente el índice.

Hasta luego.

;)