2014-10-05 5 views
1

Я использую базу данных Oracle 11G. Я создал пакет, как описано ниже:Пакет в Oracle (ошибка при вызове)

create or replace package forward_emp is  
    Function emp_sal_avg return number; 
    Procedure emp_new_sal;  
End forward_emp;  
/

package created. 

Затем я создал тело пакета:

create or replace package body forward_emp is 
    Function emp_sal_avg return number is 
    avg_sal emp.salary%type; 
    Begin 
    Select avg (salary) into avg_sal 
    from emp; 
    Return avg_sal; 
    End emp_sal_avg; 
    Procedure emp_new_sal is 
    Begin 
    Insert into Emp (salary) values (emp_sal_avg); 
    End emp_new_sal; 
End forward_emp; 
/

Package body created. 

Теперь, когда я попытался назвать пакет его показывает ошибку.

Call forward_emp.emp_new_sal; 
ORA- 06576: not a valid function or procedure. 

Пожалуйста, помогите. Не удалось понять проблему.

+0

Сохраненные процедуры запускаются с использованием команды 'execute' в Oracle - по крайней мере, в SQL * Plus и SQL Developer. –

+0

Работает с командой выполнения. Я также создал другой пакет, но они выполняются командой «Вызов». Почему это происходит – user2788235

+0

Другой пакет, о котором я говорил, состоит только из процедуры и никакой функции. Это причина. – user2788235

ответ

0

Я думаю, вы пытаетесь использовать CALL в качестве команды SQL * Plus. Как указывал AHWNN, в sqlplus вы должны использовать EXECUTE для запуска процедуры. Однако вы могли бы в тесте SQL с вызовом с помощью анонимного блока:

BEGIN 
CALL the_pack.the_proc; 
END; 
/
+0

Нет, к сожалению, это неправильное использование оператора 'call'. –

1

CALL является SQL заявления, а не PL/SQL заявления, а не SQL PLUS команды. CALL может использоваться в SQL PLUS напрямую, но при выполнении функции возвращаемый результат должен быть где-то сохранен, поэтому требуется инструкция into инструкции call. И скобки, даже если функция или хранимая процедура не имеет аргументов, тип обязателен.

Вот пример:

SQL> create or replace package pkg as 
    2 function f1 return number; 
    3 procedure p1; 
    4 end; 
    5/

Package created. 

SQL> create or replace package body pkg as 
    2 function f1 return number is 
    3 begin 
    4  return 12345; 
    5 end; 
    6 procedure p1 is 
    7 begin 
    8  null; -- does nothing 
    9 end; 
10 end; 
11/

Package body created. 

Теперь давайте выполнять эти процедуры и функции, определенной жгутов в PKG пакете:

-- variable, which is going to store result the function returns 
SQL> variable f_res number; 

-- executing the F1 function 
SQL> call pkg.f1() into :f_res; 

Call completed. 

-- print the result 
SQL> print f_res; 

    F_RES                  
----------                  
    12345                  

-- executing the P1 procedure 
SQL> call pkg.p1(); 

Call completed. 

Это то, что произойдет, если мы просто опустить скобки или не указывать into пункт при выполнении хранимой процедуры или типового метода с использованием заявления CALL:

SQL> call pkg.p1; 
call pkg.p1 
    * 
ERROR at line 1: 
ORA-06576: not a valid function or procedure name 

SQL> call pkg.f1 into :f_res; 
call pkg.f1 into :f_res 
    * 
ERROR at line 1: 
ORA-06576: not a valid function or procedure name 

SQL> call pkg.f1(); 
call pkg.f1() 
    * 
ERROR at line 1: 
ORA-06576: not a valid function or procedure name 
Смежные вопросы