Как использовать процедуру внутри пакета в PL / SQL

#oracle #plsql #package

#Oracle #plsql #пакет

Вопрос:

Как создать пакет с процедурой в нем? Процедура примет назначение и стимул в качестве входных данных и обновит зарплату сотрудника, добавив стимул для данного назначения. Отобразите количество обновленных записей о сотрудниках, например, «обновлено 3 записи о сотрудниках’. У меня есть таблица EMPLOYEE с EMP_ID, EMP_NAME, ЗАРПЛАТОЙ и НАЗНАЧЕНИЕМ. Данные функциональные требования:

 Package name as  EMP_DESIGNATION, and
Procedure signature:
EMP_DETAILS(design employee.designation%TYPE, incentive number);
  

Код, который я пробовал, это —

 set serveroutput on;
CREATE OR REPLACE PACKAGE EMP_DESIGNATION AS
 PROCEDURE EMP_DETAILS(
design employee.designation%TYPE,
incentive NUMBER) IS
BEGIN
UPDATE employee SET employee.salary = employee.salary   incentive
WHERE employee.designation = design;
dbms_output.put_line(SQL%ROWCOUNT || ' employee record(s) are updated');
END EMP_DESIGNATION;
END;
/
  

Вывод-

 Warning: Package Body created with compilation errors.
BEGIN
*
ERROR at line 1:
ORA-04063: package body "P10017.EMP_DESIGNATION" has errors
ORA-06508: PL/SQL: could not find program unit being called:
"P10017.EMP_DESIGNATION"
ORA-06512: at line 2
  

Как решить эту ошибку? Пожалуйста, помогите. Заранее благодарю вас.
PL / SQL: оператор игнорируется

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

1. Чтобы узнать, на сколько строк влияют инструкции DML, вы проверяете значение SQL%ROWCOUNT

Ответ №1:

Сначала вы должны создать спецификацию пакета, а затем его тело. Что-то вроде этого:

 SQL> CREATE OR REPLACE PACKAGE emp_designation
  2  AS
  3     PROCEDURE emp_details (design employee.designation%TYPE, incentive NUMBER);
  4  END emp_designation;
  5  /

Package created.

SQL>
SQL> CREATE OR REPLACE PACKAGE BODY emp_designation
  2  AS
  3     PROCEDURE emp_details (design employee.designation%TYPE, incentive NUMBER)
  4     IS
  5     BEGIN
  6        UPDATE employee
  7           SET employee.salary = employee.salary   incentive
  8         WHERE employee.designation = design;
  9
 10        DBMS_OUTPUT.put_line (
 11           SQL%ROWCOUNT || ' employee record(s) are updated');
 12     END emp_details;
 13  END emp_designation;
 14  /

Package body created.

SQL>
  

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

1. После внесения изменений все еще возникает ошибка кода, о которой я упоминал, отредактировав ее в вопросе выше.

2. Сделанные вами изменения были неверными. Посмотрите еще раз на мой код. Вы не можете сначала ЗАВЕРШИТЬ тело пакета, а затем ЗАВЕРШИТЬ процедуру.

3. О, так что я не должен заканчивать begin, поскольку мы завершаем как процедуру, так и пакет?

4. Вы ДОЛЖНЫ закончить все, что началось, но вы должны обратить внимание на то, что вы заканчиваете.