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

[SOLUCIONADO] Error ora-00904

Estas en el tema de Error ora-00904 en el foro de Oracle en Foros del Web. Hola. Tengo un problema con una función: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original CREATE OR REPLACE FUNCTION UF_ANHO_BISIESTO ( anho IN varchar2 ) RETURN varchar2 ...
  #1 (permalink)  
Antiguo 29/05/2015, 10:19
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Error ora-00904

Hola. Tengo un problema con una función:
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION UF_ANHO_BISIESTO (
  2. anho IN varchar2 ) RETURN varchar2
  3. IS
  4. BEGIN
  5. DECLARE
  6. anho1        NUMBER(4);
  7. ln_valor     NUMBER(1);
  8. retorna      varchar2(1);
  9. BEGIN
  10.     anho1 := to_number(anho);
  11.     BEGIN
  12.     SELECT CASE WHEN ((MOD(anho1,4) = 0) AND (MOD(anho1,100) <> 0) OR (MOD(anho1,400) = 0)) THEN 1 --Si es bisiesto retorna 1
  13.                        ELSE 0 --Si no es bisiesto retorna 0
  14.                   END
  15.     INTO ln_valor
  16.     FROM dual;
  17.    
  18.    END;
  19.    retorna := to_char(ln_valor);
  20.    RETURN TRIM(retorna);
  21. END;
  22. END;

El error exacto es: ORA-00904: "anho1": invalid identifier.
Esta función antes recibía un numero por parámetro pero, me daba el mismo error. Alguna idea para solucionarlo??
  #2 (permalink)  
Antiguo 29/05/2015, 10:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error ora-00904

Por empezar, me parece que lo estás complicando de más...

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION UF_ANHO_BISIESTO (anho IN varchar2 ) RETURN varchar2
  2. IS
  3. BEGIN
  4.   DECLARE
  5.   anho1        NUMBER(4);
  6.   retorna      varchar2(1);
  7.   BEGIN
  8.       anho1 := TO_NUMBER(anho);
  9.       IF (MOD(anho1,4) = 0 AND MOD(anho1,100) <> 0) OR (MOD(anho1,400) = 0)) THEN
  10.           retorna := '1'; --Si es bisiesto retorna 1
  11.       ELSE
  12.           retorna := '0'; --Si no es bisiesto retorna 0
  13.      END IF;
  14.      RETURN retorna;
  15.   END;
  16. END;
__________________
¿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 29/05/2015, 10:46
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Error ora-00904

Gracias por mejorar el query pero, sigue dando el mismo error. Alguna otra idea?
  #4 (permalink)  
Antiguo 01/06/2015, 13:03
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Error ora-00904

Yo te recomiendo hacerlo de esta forma

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION UF_ANHO_BISIESTO (
  2. anho IN varchar2 ) RETURN varchar2
  3. IS
  4. v_fecha DATE;
  5. retorna VARCHAR2(1);
  6. BEGIN
  7.   BEGIN
  8.     v_fecha := TO_DATE(anho||'0229','YYYYMMDD');
  9.     retorna := '1';
  10.   exception WHEN others THEN
  11.     retorna := '0';
  12.   END;
  13.   RETURN retorna;  
  14. END;
  15. /

Lo que hace es un CAST forzado a fecha del año con el mes de febrero y el dia 29. Si es casteo es correcto, devuelve 1, de lo contrario devuelve 0 controlado por un exception interior.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 02/06/2015, 11:27
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Error ora-00904

Gracias por sus respuestas. Por lo que estuve averiguando el problema no es la función, sino algo de permisos y perfiles del usuario de oracle y con el que me conecto, alguien le paso esto??? Uso PowerBuilder7 para hacer estos reportes. Gracias por su ayuda.
  #6 (permalink)  
Antiguo 02/06/2015, 11:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error ora-00904

Es usual ese tipo de conflictos. Las reglas de permisos de Oracle son algo exigentes.

Por lo pronto, el usuario con el que quieres ejecutar la SF debe tener permisos de EXECUTE sobre el esquema a que pertenezca la SF, y sobre el SF en sí (puedes ver un esquema y no sus rutinas almacenadas, o parte de ellas).
Además, si la SF está dentro de un package, deberá tener permisos para ejecutar ese package, y si el package contiene otros componentes (SP) que invoquen objetos de la base como sinonimos, vistas o tablas, deberá tener permisos sobre todos esos objetos.
De hecho, puedes crear un sinónimo sobre una tabla, por ejemplo, y darle a un usuario los permisos sobre el sinonimo. Pero si no se los das sobre el objeto que referncia el sinónimo, no funcionará.

Como te digo, Oracle es algo más exigente que otros DBMS en ciertos temas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 03/06/2015, 08:48
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Error ora-00904

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es usual ese tipo de conflictos. Las reglas de permisos de Oracle son algo exigentes.

Por lo pronto, el usuario con el que quieres ejecutar la SF debe tener permisos de EXECUTE sobre el esquema a que pertenezca la SF, y sobre el SF en sí (puedes ver un esquema y no sus rutinas almacenadas, o parte de ellas).
Además, si la SF está dentro de un package, deberá tener permisos para ejecutar ese package, y si el package contiene otros componentes (SP) que invoquen objetos de la base como sinonimos, vistas o tablas, deberá tener permisos sobre todos esos objetos.
De hecho, puedes crear un sinónimo sobre una tabla, por ejemplo, y darle a un usuario los permisos sobre el sinonimo. Pero si no se los das sobre el objeto que referncia el sinónimo, no funcionará.

Como te digo, Oracle es algo más exigente que otros DBMS en ciertos temas.
si me lo permites, te corrijo una cosilla :

y si el package contiene otros componentes (SP) que invoquen objetos de la base como sinonimos, vistas o tablas, deberá tener permisos sobre todos esos objetos

Eso no es correcto, si tienes permisos de execute sobre el package, heredas los permisos que tenga el owner del package sobre los objetos a los que referencia el codigo de las funciones o procedures que contiene ese package.

Si quieres que eso no sea así, deberás crear el package ( especificacion ) con la restriccion AUTHID CURRENT_USER.

Eso indica que ese package se ejecutará con los permisos que tiene el llamante, no con los del propietario del package
  #8 (permalink)  
Antiguo 02/07/2015, 07:59
Avatar de Doglas  
Fecha de Ingreso: mayo-2015
Mensajes: 22
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Error ora-00904

Bueno muchachos, gracias por su ayuda y sus aportes que son interesantes. Este problema se soluciono ya hace buen tiempo, y era porque el DBA olvido correr la función en cuestión en el servidor de producción.
  #9 (permalink)  
Antiguo 02/07/2015, 09:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error ora-00904

Cita:
Iniciado por Doglas Ver Mensaje
Bueno muchachos, gracias por su ayuda y sus aportes que son interesantes. Este problema se soluciono ya hace buen tiempo, y era porque el DBA olvido correr la función en cuestión en el servidor de producción.


¡Genios!



No te preocupes, en la empresa que trabajo también se mandan esas genialidades, y otras que no podrías creer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: Ninguno
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:04.