создание пакета с функцией и процедурой pl sql

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

Итак, я создал функцию и процедуру. Функция должна возвращать год с наибольшим количеством сотрудников в отделе (ввод пользователем). Затем процедура отобразит список сотрудников в отделе с определенным годом (год используется из возврата функции). Затем я компилирую их в пакет. Но когда я их вызвал, он не работает. в нем говорится: «не выполнено, тело пакета «SQL_CXYSUJQLPSOQZJEYHEXHDIXUZ.MY_PCKG» не существует ORA-06512: в строке 5″. Есть идеи? Спасибо!

 create or replace package my_pckg as 
function check_date (my_name departments.department_name%type) RETURN INT;
procedure check_name(P_IN_DEPT_NAME IN VARCHAR2,P_IN_YEAR IN NUMBER);
END;
/

declare
my_var int;
my_var2 departments.department_name%type:='Shipping';
begin
my_var:=my_pckg.check_date(my_var2);
dbms_output.put_line(my_var);
my_pckg.check_name(my_var2,my_var);
end;
/
  

Комментарии:

1. Перед DECLARE операцией попробуйте написать SET SERVEROUTPUT ON , а также, пожалуйста, поделитесь, в чем смысл того, что не работает? Выдает ли он какую-либо ошибку или не возвращает правильный вывод?

2. ошибка «не выполняется, тело пакета «SQL_CXYSUJQLPSOQZJEYHEXHDIXUZ.MY_PCKG» не существует ORA-06512: в строке 5″ @Tejash

3. Вы создали объявление пакета, но не создали тело пакета. Вам необходимо создать тело пакета с тем же фактическим кодом функции / процедуры.

4. Теперь я понял. Спасибо! @Tejash

Ответ №1:

Глядя на вашу проблему, кажется, что вы не создали тело пакета.

  • Package (заголовок) содержит единственное объявление function/procedure внутри него.
  • Фактическая реализация function/procedure должна быть включена в тело пакета.

Что-то вроде следующего:

 CREATE OR REPLACE PACKAGE PKG_NAME AS
  -- DECLARATION OF FUNCTION AND PROCEDURE WILL GO HERE
  FUNCTION FUN1(....);
  PROCEDURE PROC1(....);
END PKG_NAME;
/

CREATE OR REPLACE PACKAGE BODY PKG_NAME AS 
  -- ACTUAL IMPLEMENTATION OF FUNCTION AND PROCEDURE WILL GO HERE
  FUNCTION FUN1(....) AS
  ....
  ....
  END FUN1;

  PROCEDURE PROC1(....) AS
  ....
  ....
  END PROC1;
END PKG_NAME;
/