PL/SQL llama a una función fuera de un paquete

Defino una función fuera de un paquete, intenté llamar a esta función, fallé.

Como arreglarlo ? Gracias

create or replace
package body test_erp AS    
    procedure init_data is
    begin             
        logMessage('procedure init_data');
    end init_data;        
end test_erp;
/

show error

el error es

PLS-00221: 'LOGMESSAGE' is not a procedure or is undefined

preguntado el 01 de julio de 12 a las 16:07

2 Respuestas

Como sugiere el error logmessage no es un procedimiento. es una funcion Como las funciones devuelven algo, debe asignarlo a una variable. Tú lo sabes logmessage devuelve un número, por lo que debe declarar una variable para poner este valor de retorno.

create or replace package body test_erp AS    
    procedure init_data is

    l_success number;

    begin        

        l_message := logMessage('procedure init_data');
        dbms_output.put_line(to_char(l_success));

    end init_data;        

end test_erp;
/

Sin embargo, parece logmessage debemos ser de hecho un procedimiento. Supongo que está ejecutando instrucciones DML (actualizar/insertar) en esto. Una llamada de función se utiliza en un select declaración a menos que este sea el caso, lo que significa que siempre existe la posibilidad de que ocurra un error. Si logmessage fuera un procedimiento se puede declarar un out parámetro para decirle al procedimiento de llamada si todo funcionó o no; algo como lo siguiente:

create or replace procedure logmessage( msg in varchar2, success out number) is

begin

   insert into logs values(msg);
   success := 1;
exception when others then
   success := 0;
end logmessage;

A continuación, puede llamarlo de la siguiente manera:

create or replace package body test_erp AS    
   procedure init_data is

       l_success number;

   begin        

      logMessage('procedure init_data', l_success);
      dbms_output.put_line(to_char(l_success));

   end init_data;        
end test_erp;
/

If logmessage no se va a utilizar fuera del paquete test_erp Lo pondría dentro del paquete; mantiene el espacio de nombres más limpio y evita que se use por error como otro paquete/llamada, etc.

Respondido 01 Jul 12, 16:07

No hay problema @ usuario595234, si es posible sugeriría leer algo como este tutorial, que cubre las cosas más simples como cómo llamar a una función. ¡Parece que te estás moviendo muy rápido! Aunque supongo que estás haciendo más de lo indicado. - paquet

Asumiendo que logMessage es la misma función de este enviar:

Como logMessage es una función (y devuelve un número), debe llamarla así:

procedure init_data is
    i number;
begin             
    i := logMessage('procedure init_data');
end init_data; 

contestado el 23 de mayo de 17 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.