funciones - La función NEXT_DAY funciona de manera diferente en SQL vs. PL/SQL?
pivot oracle ejemplos (2)
¿Por qué funciona esta consulta SQL?
SELECT NEXT_DAY(SYSDATE, 7)
FROM DUAL;
NEXT_DAY(SYSDATE,7) ------------------- 01-APR-17 1 row selected.
... pero este bloque anónimo de PL / SQL no funciona?
DECLARE
dteExpires DATE;
BEGIN
dteExpires := NEXT_DAY(SYSDATE, 7);
END;
Error at line 1 ORA-01846: not a valid day of the week ORA-06512: at line 4
No quiero codificar el segundo parámetro con el nombre en inglés de un día, por ejemplo. NEXT_DAY(SYSDATE, ''SATURDAY'')
o NEXT_DAY(SYSDATE, ''SUNDAY'')
etc.
Por ahora, utilizaré el siguiente trabajo, pero me gustaría saber por qué NEXT_DAY()
comporta de manera diferente en PL / SQL que en SQL.
DECLARE
dteExpires DATE;
BEGIN
-- 2017-01-01 = SUNDAY
dteExpires := NEXT_DAY(SYSDATE, TO_CHAR(TO_DATE(''2017-01-01'', ''YYYY-MM-DD''), ''DAY''));
END;
Este es mi entorno DEV:
SELECT *
FROM v$version;
BANNER -------------------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production PL/SQL Release 12.1.0.2.0 - Production CORE 12.1.0.2.0 Production TNS for 64-bit Windows: Version 12.1.0.2.0 - Production NLSRTL Version 12.1.0.2.0 - Production 5 rows selected.
Si revisa la documentación de la versión SQL de NEXT_DAY, encontrará que no está documentado el hecho de pasar un número para representar un día de la semana. Funciona, por la razón que sea, pero si confía en que funcione, corre el riesgo de que en el futuro Oracle cambie la implementación para cumplir con la especificación establecida de esta función. (El riesgo es pequeño, ya que Oracle no está loco).
https://docs.oracle.com/database/121/SQLRF/functions118.htm#SQLRF00672
La implementación de PL / SQL solo funciona con la especificación documentada, no acepta una entrada numérica para representar un día de la semana.
Supongo que esta es una respuesta indirecta. Creo que estás haciendo la pregunta incorrecta. La pregunta no debería ser "¿por qué esto no funciona en PL / SQL"; más bien, dada la documentación, la pregunta debería ser "por qué funciona en Oracle SQL". Solo Oracle puede responder eso.
Puede encontrar esta discusión en OTN útil: https://community.oracle.com/thread/4023654
Y tal vez esto también: https://community.oracle.com/ideas/17257?tab=comment
Creo que la única forma de hacer que la función NEXT_DAY
independiente de la sesión actual NLS_DATE_LANGUAGE
es una solución alternativa con ISO semana, donde el primer día de la semana siempre es el lunes:
SELECT NEXT_DAY(SYSDATE, TO_CHAR(TRUNC(SYSDATE, ''IW'')+5, ''Day''))
from dual;
TRUNC(SYSDATE, ''IW'')+5
significa "El próximo sábado"