Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Foros > Oracle > Como evitar la inserción de más de dos elementos en una tabla?
-Foros de debate

Oracle
Lista de foros | Lista de mensajes de este foro

Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.

Como evitar la inserción de más de dos elementos en una tabla?
Enviado por tor el día 2 de junio de 2006

Primero de todo, buenas a todos. Soy nuevo en esto de las BBDD y en oracle. Mi problema es que quiero que una tabla de directivos tenga como maximo dos. He estado provando con triggers, haciendo una consulta a la misma tabla antes de insertar pero al ejecutarlo me dava errores. Aki os dejo el codigo del trigger a ver que os parece:

CREATE OR REPLACE TRIGGER Insert_directivo AFTER INSERT ON Directivo
FOR EACH ROW
DECLARE

max_directivos INTEGER:=2;
num_directivos INTEGER;

BEGIN
SELECT COUNT(*) INTO num_directivos FROM Directivo;
IF (num_directivos >= max_directivos )
THEN raise_application_error(-20601, 'intento de insertar un 3r directivo');
END IF;
END;

Espero respuestas gracias

 
Re: Como evitar la inserción de más de dos elementos en una tabla?
Enviado por Alex el día 2 de junio de 2006

¿ No has puesto esto ya el otro dia ?

Pero bueno, como el que la sigue, la consigue vamos a ver :

Dices que te da errores ¿ los puedes poner o te quema el teclado ?.

Venga, te ahorro el trabajo. Te dá error de tabla mutando ¿ verdad ?

Así, a bote pronto, aunque seguro que hay mas soluciones a este espinoso enigma, se me ocurren tres cosas, 2 faciles y una dificil, elige la que quieras: las polleces o la cojonera que te va a costar sacarla, pero que a ti , que estás empezando en esto del oracle te va a servir de mucho, allá van :

1-) Cada vez que insertes un directivo, primero añades una linea a un fichero plano con el utl_file, luego cuentas las lineas que tiene y si tiene 3... VOILÁ, a raisear tocan y a crear de nuevo el fichero con dos lineas ( esto se aplica tb a los deletes sobre esa tabla, no lo olvides )
2-) create una tabla con un unico campo y cada vez que modifiques la tabla directivos actualiza ese campo.
3-) Te recomiendo está para que te pelees y aprendas, es la solución que propone Oracle para este problema, pero avisa de que no es efectivo 100x100. Create un paquete de BBDD y utiliza una tabla pl-sql. No me digas que te ponga un ejemplo porqué no lo voy hacer, ahorrate el trabajo. Lo que si puedes hacer es buscar en el google esto : << MUTATING TABLE ORACLE, PACKAGE >>. Seguro que encuentras mucha documentacion al respecto.

 
Re: Re: Como evitar la inserción de más de dos elementos en una tabla?
Enviado por tor el día 2 de junio de 2006

Primero de todo gracias por contestar, es verdad que lo puse el otro dia pero como nadie dijo nada, pues lo he puesto otra vez pero con el codigo del trigger. El error no lo puse porque no creia que sirviera de nada, es este:

Warning: Trigger created with compilation errors.

Que tampoco no es un error, es solo un warning, perdon. En todo caso que errores de compilación hay??
Buscare por el google algo sobre la terecera opcion que me has puesto a ver si me sirve de ayuda.

Un saludo y gracias.

 
Re: Re: Re: Como evitar la inserción de más de dos elementos en una tabla?
Enviado por alfaq el día 3 de junio de 2006

el trigger no debe enviar warning y por otro lado
debe ser un before insert, para que te funciones como quieres, de lo contrario la tabla esta mutando.

 
Re: Re: Re: Re: Como evitar la inserción de más de dos elementos en una tabla?
Enviado por Alex el día 3 de junio de 2006

Hola de nuevo.

He mirado bien el codigo del triger y no veo nada raro para que de errores.

Pon esto en el sql plus :

ALTER TRIGGER Insert_directivo COMPILE;

Si te sale este mensaje :

Warning: Trigger altered with compilation errors

Teclea esto otro :

SHOW ERRORS

Y nos pones lo que te salga.

Pero no veo que puede estar mal, el trigger debería fallar en ejecución, no en compilación.

¿ lo estas creando con el usuario dueño de la tabla ?

Puede que te falte esta linea en la cabecera, aunque creo que no es necesario ponerla :

REFERENCING NEW AS :NEW OLD AS :OLD

O que te sobre el DECLARE.

Ahora no te lo puedo asegurar, pero el lunes en el curro lanzo ese mismo codigo sobre una tabla nuestra y te digo exactamente donde dá el error.

Mientras tanto, busca esa documentación que te puse

Buen finde


 




Re: Como evitar la inserción de más de dos elementos en una tabla?
Enviado por tor el día 5 de junio de 2006

Muchas gracias chicos, ya he arreglado el problema, el problema estava en el raise, lo que passa es que aki en la web no sé ve porque cambié el texto(lo siento), pero antes tenia un \' enmedio y era ese el error que encontrava. Gracias a la instruccion compile y a lo del show errors, he encontrado el error. Por cierto alfaq en lo del before tenias razon, la intencion era que lo mirara antes, y respecto a lo del raise a mi no me ha dado ningun problema, lo que consigo con el raise es que si alguien inserta un 3r directivo le sale el error que yo escribo, mas los que pone oracle, pero creo que no queda del todo mal, se entiende mejor en que la estas cagando. Tambien he quitado el texto \"FOR EACH ROW\" ya que el trigger afecta a la insercion en la tabla y no a una sola fila.
Y nada mas, muchas gracias a los que me habeis ayudado y a ver si esto sirve para algun que otro novato com yo que se encuentre en la misma situación.

Aki os pongo el trozo de codigo que ha kedado:
CREATE OR REPLACE TRIGGER Insert_directivo BEFORE INSERT ON Directivo
DECLARE

max_directivos INTEGER:=2;
num_directivos INTEGER;

BEGIN
SELECT COUNT(*) INTO num_directivos FROM Directivo;
IF (num_directivos >= max_directivos )
THEN raise_application_error(-20601, \'intento de insertar un 3r directivo\');
END IF;
END;

 


Tienda
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network