2010-06-24 20 views
10

Tengo el siguiente evento pequeño que no se compila:¿Cómo puedo solucionar este error "Declaración SQL ignorada"?

function f_query_01 Return interval Day to second is 
    start_time timestamp(3); 
    end_time timestamp(3); 
    time_diff interval Day to second; 
    c_query_number number; 

begin 

    start_time := systimestamp; 
    select count(*) into c_query_number from wg; <--This is the line that errors out 
    end_time := systimestamp; 
    time_diff := start_time - end_time; 

    return time_diff; 

end f_query_01; 

El compilador me da los siguientes errores:

Error(29,3): PL/SQL: SQL Statement ignored 
Error(29,44): PL/SQL: ORA-04044: procedure, function, package, or type is not allowed here 

Qué está causando este error y cómo puedo solucionarlo?

+0

¿'select count (*) en c_query_number from wg;' funciona fuera de la función, cuando se ejecuta en la misma base de datos/esquema que la función? –

+0

Interesante. Probó este código, sustituyendo wg por otra tabla pequeña. Compilado y ejecutado con éxito. ¿Estás seguro de que este es exactamente el código que tuvo un problema? –

+3

El problema era que la tabla wg no existía. Una vez que cambié el nombre de la tabla al nombre correcto, todo estaba bien. Realmente creo que el mensaje de error fue bastante engañoso en este caso, lo que sucede, pero sigue siendo frustrante. – twamn

Respuesta

10

Parece que la tabla wg no existe. Cuando se actualiza con el nombre de tabla correcto, la compilación funciona sin errores. Un mensaje del compilador de la tabla no existe sería de gran ayuda.

+4

Comprobación de google, tengo que estar de acuerdo - pobres mensaje de error. –

+0

Creo que el razonamiento detrás del mensaje de error es que si el objeto no está en el diccionario de datos, entonces debe ser un objeto definido localmente, por lo tanto, "procedimiento, función, paquete o tipo", que son todas las cosas que se pueden definir con una función. – Allan

+1

Cuando compilé el código, recibí un error de 'tabla no existe'. Cuando lo compilé cuando tenía una función llamada wg, obtuve el error descrito. Tal vez había un sinónimo público de otro 'wg' en alguna parte. –

1
CREATE OR REPLACE FUNCTION f_query_01 
    RETURN NUMBER 
IS 
BEGIN 
    DECLARE 
     c_query_number NUMBER DEFAULT NULL; 
     start_time  DATE DEFAULT NULL; 
     end_time   DATE DEFAULT NULL; 
     time_diff  NUMBER DEFAULT NULL; 
    BEGIN 
     SELECT CAST (SYSTIMESTAMP AS DATE) INTO start_time FROM DUAL; 

     SELECT COUNT (*) INTO c_query_number FROM ws; 

     SELECT CAST (SYSTIMESTAMP AS DATE) INTO end_time FROM DUAL; 

     time_diff := start_time - end_time; 

     RETURN time_diff; 
    END; 
END f_query_01; 
Cuestiones relacionadas