Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Trigger sobre día de la semana

Estas en el tema de Trigger sobre día de la semana en el foro de Oracle en Foros del Web. Buenas, llevo dándole vueltas a esto un montón de tiempo y no sé por qué no funciona el siguiente trigger en Oracle SQL Developer: @import ...
  #1 (permalink)  
Antiguo 02/01/2017, 13:30
 
Fecha de Ingreso: mayo-2014
Mensajes: 23
Antigüedad: 10 años, 5 meses
Puntos: 0
Trigger sobre día de la semana

Buenas, llevo dándole vueltas a esto un montón de tiempo y no sé por qué no funciona el siguiente trigger en Oracle SQL Developer:

Código Sql:
Ver original
  1. CREATE OR REPLACE TRIGGER TR_Dias_Tutorias
  2. AFTER INSERT OR UPDATE OF Fecha ON Tutorias
  3. FOR EACH ROW
  4. DECLARE
  5.     v_Fecha DATE := :NEW.Fecha;
  6.     v_Dia VARCHAR2(20);
  7. BEGIN
  8.     SELECT TO_CHAR(v_Fecha, 'DAY', 'NLS_DATE_LANGUAGE=SPANISH') INTO v_Dia FROM Dual;
  9.     IF v_Fecha LIKE 'SÁBADO' OR v_Fecha LIKE 'DOMINGO' THEN
  10.         RAISE_APPLICATION_ERROR(-20020, 'Los días de la semana en dónde se puede realizar una tutoría deben estar entre lunes y viernes');
  11.     END IF;
  12. END;


Lo que quiero concretamente es que salte el mensaje de error si la fecha que se inserta o actualiza es sábado o domingo.

Curiosamente si hago la consulta a parte sí que me devuelve el día de la semana pero a la hora de ejecutar el trigger e intentar insertar un dato o actualizarlo, no sale nunca el error y se inserta o actualiza correctamente.

No sé qué puede estar fallando, he probado varias alternativas y ninguna funciona T_T. Gracias por adelantado!
  #2 (permalink)  
Antiguo 03/01/2017, 05:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Trigger sobre día de la semana

En primer lugar, porque el IF no lo estás haciendo sobre el la variable destino del INTO, sino sobre la variable de entrada, con la fecha...

Código SQL:
Ver original
  1. IF v_Fecha LIKE 'SÁBADO' OR v_Fecha LIKE 'DOMINGO' THEN

Y asi tomas el valor que deseas:

Código SQL:
Ver original
  1. SELECT TO_CHAR(v_Fecha, 'DAY', 'NLS_DATE_LANGUAGE=SPANISH') INTO v_Dia FROM Dual;

No es la misma variable, como ves.


Por otro lado es totalmente innecesario hacer comparaciones con cadenas de texto (las cuales podrían causarte problemas con los acentos), cuando puedes usar valores numéricos:

Código SQL:
Ver original
  1. CREATE OR REPLACE TRIGGER TR_Dias_Tutorias
  2. AFTER INSERT OR UPDATE OF Fecha ON Tutorias
  3. FOR EACH ROW
  4. DECLARE
  5.     v_Fecha DATE := :NEW.Fecha;
  6.     v_Dia VARCHAR2(20);
  7. BEGIN
  8.     SELECT TO_CHAR(v_Fecha, 'D') INTO v_Dia FROM Dual;
  9.     IF v_Fecha IN (1, 7) THEN
  10.         RAISE_APPLICATION_ERROR(-20020, 'Los días de la semana en dónde se puede realizar una tutoría deben estar entre lunes y viernes');
  11.     END IF;
  12. END;

Adicionalmente, LIKE se usa para cadenas de texto en consulta por patrones y no por igualdades. No tiene la misma logica interna en Oracle, no se usan para las mismas cosas, y la performance puede ser pésima siendo usada de modo inadecuado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 03/01/2017, 08:00
 
Fecha de Ingreso: mayo-2014
Mensajes: 23
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Trigger sobre día de la semana

Vaya fail de despiste lo de la variable x.x. Por otro lado, esto:

Código SQL:
Ver original
  1. IF v_Fecha IN (6, 7) THEN

No crees que es peor que mi otra opción porque dependiendo del territorio en el que estés va a ser [7,1] en vez de [6,7]? Entonces deja de ser un trigger válido universalmente.
  #4 (permalink)  
Antiguo 03/01/2017, 08:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Trigger sobre día de la semana

El valor devuelto por TO_CHAR(fecha, 'D') aplica al sitio donde se encuentre el servidor de la base de datos, y es independiente del formato de fecha local, porque devuelve un número en el rango 1 a 7 dependiendo del día de la semana en cuestión (Lunes = 1, Martes = 2, etc).

Código SQL:
Ver original
  1. SELECT TO_CHAR (TO_DATE ('30/01/2016', 'dd/mm/rrrr',
  2.      'NLS_DATE_LANGUAGE = Spanish'), 'D') "Formato SP",
  3.        TO_CHAR (TO_DATE ('01/30/2016', 'mm/dd/rrrr',
  4.      'NLS_DATE_LANGUAGE = American'), 'D') "Formato EN",
  5.        TO_CHAR (TO_DATE ('01/30/2016', 'mm/dd/rrrr',
  6.      'NLS_DATE_LANGUAGE = German'), 'D') "Formato GER"
  7.   FROM DUAL;

Cualquier duda, consulta el manual y haz pruebas en diferentes servidores de datos.

http://docs.oracle.com/cd/B19306_01/...nctions180.htm


Y... NO. Trabajar con resultados en cadenas de texto no es mejor que hacerlo con valores numéricos.

Haz la prueba y seguimos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/01/2017 a las 08:32

Etiquetas: bases-de-datos-general, int, semana, trigger, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:55.