Hasta los mismisimos de Oracle, me echais una mano?

Bueno, esto tiene pinta de ser otro de los post que hago y triunfan, pero una cosa mala ehh!

Pues eso, estoy un poco harto de Oracle y estoy un tanto liado.

Tengo que hacer un Trigger PLSQL que inserte en la tabla noticias una fecha y una descripción tipo “COMPRADO JUGADOR X POR EL EQUIPO Y”, donde X es el nombre del jugador e Y el nombre del equipo, cada vez que se produzca una inserción en la tabla jugadores.

Especifico que la tabla Noticias donde hay que almacenar ese registro no existe por lo que tengo que comprobar si existe o no, y a continuacion hacer el INSERT...

Tengo la tabla de Jugadores y la de Equipos, por lo que me dispongo a ello y sale este "chorizo":

CREATE OR REPLACE TRIGGER comprarJugador
AFTER INSERT
ON jugadores
FOR EACH ROW

BEGIN
    sDescripcion VARCHAR2(200);
    sDniJugador jugadores.dni%type;
    sNombreEquipo equipos.nombre%type;

    sDescripcion := "Vendido el jugador " || sDniJugador || " por el equipo " || sNombreEquipo;

    IF noticias NOT EXISTS
       CREATE TABLE noticias
       (
              fecha DATE NOT NULL,
              descripcion VARCHAR2(200) NOT NULL
       );
       
       INSERT INTO noticias VALUES (SYSDATE, sDescripcion);
    ELSIF
       INSERT INTO noticias VALUES (SYSDATE, sDescripcion);     
    END;
   
EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Error Procedimiento en Trigger');   
END comprarJugador;


Y la pregunta es..

De donde saco los datos que ha Insertado el Usuario en la tabla Jugadores y que tengo que registrar en la tabla de noticias?

Si no me explico bien preguntar, pero paso de explayarme aqui para que nadie sepa hacerlo y perder tiempo.. xDDDD


Thx y todo eso, el que me responda sera recompensado con toda mi gratitud y un aprobado la semana que viene! =D
supongo que tendras que hacer una consulta sobre la tabla jugadores y meter los resultados en variables?
No entiendo como sabes hacer todo eso y preguntas esto xD
DjTemplar escribió:supongo que tendras que hacer una consulta sobre la tabla jugadores y meter los resultados en variables?
No entiendo como sabes hacer todo eso y preguntas esto xD



No es una consulta en sí, es un "Disparador" (Trigger) que hace que cuando alguien inserte un jugador en la tabla Jugadores se active. Cuando este se active insertara en una tabla Noticias que " Se ha insertado X Jugador en Y equipo", y claro, hay que comprobar que la tabla Noticias este creada.

El problema no viene de como insertar o no, sino que en la tabla Noticias tengo que pasar el nombre y el equipo del jugador que se ha insertado, y debe de ser automatico por lo que tengo que sacar esos datos de la Select que hace la persona que inserta en la tabla jugadores, y no se como hacerlo.

No se si me explico.. xD
Dasten escribió:
DjTemplar escribió:supongo que tendras que hacer una consulta sobre la tabla jugadores y meter los resultados en variables?
No entiendo como sabes hacer todo eso y preguntas esto xD



No es una consulta en sí, es un "Disparador" (Trigger) que hace que cuando alguien inserte un jugador en la tabla Jugadores se active. Cuando este se active insertara en una tabla Noticias que " Se ha insertado X Jugador en Y equipo", y claro, hay que comprobar que la tabla Noticias este creada.

El problema no viene de como insertar o no, sino que en la tabla Noticias tengo que pasar el nombre y el equipo del jugador que se ha insertado, y debe de ser automatico por lo que tengo que sacar esos datos de la Select que hace la persona que inserta en la tabla jugadores, y no se como hacerlo.

No se si me explico.. xD


no te entiendo, se lo que es un disparador y para que sirve , pero no te entiendo xD

vale perdona creo que me acuerdo, prueba con : old.dni, : old.descricpion, : old.nombreequipo

los dos puntos delante de old van juntos al old es que sale un emoticono xD

Por cierto si pones eso y no te sale prueba a cambiar el "after por ""before", hace tiempo que no uso esto, no me acuerdo muy bien
Es sencillo, es el nombre del campo precedido de la palabra new o old.

Es decir, en tu caso new.dni y new.nombre.

En caso de Update en vez de insert new.dni el valor nuevo y old.dni el viejo.
Vale, esto me suena mas.. xD!

Ahora esperar a que funcione, os dire como va la cosa, a ver si funciona! =D

edito
Nada, lo intento pero me da error en el IF, como si no soportase poner un CREATE TABLE dentro de un If... tengo algo mal y no se donde, aqui el code..

CREATE OR REPLACE TRIGGER comprarJugador
AFTER INSERT
ON jugadores
FOR EACH ROW
 
DECLARE
    sDescripcion VARCHAR2(200);
   
BEGIN

    sDescripcion := "Vendido el jugador " || :old.dni || " por el equipo " || :old.nombre;

    IF NOT EXISTS (SELECT * FROM noticias) THEN
       CREATE TABLE noticias
       (
              fecha DATE NOT NULL,
              descripcion VARCHAR2(200) NOT NULL
       );
       
       INSERT INTO noticias VALUES (SYSDATE, sDescripcion);
    ELSIF
       INSERT INTO noticias VALUES (SYSDATE, sDescripcion);     
    END IF;
   
EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Error en Trigger');   
END comprarJugador;

Alguien sabe porque es? o.o

Thx!! =D
CREATE OR REPLACE TRIGGER comprarJugador
AFTER INSERT
ON jugadores
FOR EACH ROW
 
DECLARE
    sDescripcion VARCHAR2(200);
    Existe as number;
BEGIN

    sDescripcion := "Vendido el jugador " || :old.dni || " por el equipo " || :old.nombre;

    Select count(1) into Existe from all_tables where table_name = 'noticias';
    If existe > 1 then
       EXECUTE IMMEDIATE (CREATE TABLE noticias (fecha as DATE NOT NULL, descripcion as VARCHAR2(200) NOT NULL));
       INSERT INTO noticias VALUES (SYSDATE, sDescripcion);
    ELSIF
       INSERT INTO noticias VALUES (SYSDATE, sDescripcion);     
    END IF;
   
EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Error en Trigger');   
END comprarJugador;
Delian escribió:
CREATE OR REPLACE TRIGGER comprarJugador
AFTER INSERT
ON jugadores
FOR EACH ROW
 
DECLARE
    sDescripcion VARCHAR2(200);
    Existe as number;
BEGIN

    sDescripcion := "Vendido el jugador " || :old.dni || " por el equipo " || :old.nombre;

    Select count(1) into Existe from all_tables where table_name = 'noticias';
    If existe > 1 then
       EXECUTE IMMEDIATE (CREATE TABLE noticias (fecha as DATE NOT NULL, descripcion as VARCHAR2(200) NOT NULL));
       INSERT INTO noticias VALUES (SYSDATE, sDescripcion);
    ELSIF
       INSERT INTO noticias VALUES (SYSDATE, sDescripcion);     
    END IF;
   
EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line('Error en Trigger');   
END comprarJugador;


Probé con el " Existe from all_tables where table_name = 'noticias'; " pero fallaba, y por lo que se ve era el count, si no lo hacia..

Y tambien probé con el inmediate execute y fi funcionaba pero paba lo mismo, fallaba en la sentencia.. ._.

Y acabo de probar lo que me has pasado y me sigue fallando en lo mismo, en la linea de
EXECUTE IMMEDIATE (CREATE TABLE noticias (fecha as DATE NOT NULL, descripcion as VARCHAR2(200) NOT NULL));


La excepcion es esta:

Compilation errors for TRIGGER TEMA6.COMPRARJUGADOR

Error: PLS-00103: Se ha encontrado el símbolo "CREATE" cuando se esperaba uno de los siguientes:
       
          begin case declare exit for goto if loop mod null pragma
          raise return select update while with <an identifier>
          <a double-quoted delimited-identifier> <a bind variable> <<
          close current delete fetch lock insert open rollback
          savepoint set sql execute commit forall merge pipe
Line: 14
Text: CREATE TABLE noticias


Ya no se que puede ser..
No te aconsejo poner un create table en un trigger, cuando hagas el despliegue crea la tabla y ya esta.
Dare por supuesto que la tabla esta creada y ya esta, que le den al ejercicio.. llevo como 3 horas para hacer una chorrada que se hace en 15 minutos.. ._.

Gracias, ire poniendo dudas que tenga en otros ejercicios, si no os importa.. xD
Yo es que eso de crear tablas dentro de un trigger no lo veo. Lo suyo sería hacer dos bloques. El primero que compruebe si existe la tabla con un select y en caso negativo crearla. Y luego, en un bloque interno, hacer el trigger. Sería algo así:

1- Bloque para comprobar que existe la tabla y crearla.
2- Bloque para el trigger donde se hace la inserción.
3- Finalizar bloque del trigger.
4- Finalizar bloque de la comprobación de tabla.

Es que me parece un poco bruto intentar que un trigger cree tablas cuando el trigger como mucho inserta, modifica o borra, si no recuerdo mal.

Un saludo!
10 respuestas