Обнаружен символ «END» при ожидании одного из следующих действий: начать функцию прагма процедура - PullRequest
0 голосов
/ 15 апреля 2019

Я получаю сообщение об ошибке при попытке создать пакет с процедурами внутри него. Мне нужно создать глобальный курсор, а также 2 процедуры и функцию.

ниже - вопрос, на который я пытаюсь ответить. Напишите пакет с именем cursor_state, который объявляет глобальный курсор как соединение СОТРУДНИКИ и ОТДЕЛЕНИЯ. Курсор должен выбрать имя и фамилию каждого сотрудника, название отдела и зарплату сотрудника. Пакет также должен содержать три открытые процедуры: первая открывает курсор; второй имеет параметр IN типа NUMBER и выбирает и отображает количество строк, а также текущее значение счетчика цикла. Третья процедура закрывает курсор. Не забудьте проверить состояние курсора, прежде чем пытаться открывать или закрывать его в каждой процедуре.

и код, который я придумал

CREATE OR REPLACE PACKAGE cursor_state IS
CURSOR emp_curs IS
  SELECT first_name, last_name, department_name, salary
  FROM employees, departments
  WHERE employees.department_id = departments.department_id;

PROCEDURE open_curs;
FUNCTION fetch_rows RETURN BOOLEAN;
PROCEDURE close_curs;
END cursor_state;

А вот и создание ТЕЛА

CREATE OR REPLACE PACKAGE BODY cursor_state IS 

PROCEDURE open_curs IS 
BEGIN 
  IF NOT emp_curs%ISOPEN THEN OPEN emp_curs; 
  END IF;
END open_curs; 

FUNCTION fetch_rows(n NUMBER := 1) RETURN BOOLEAN IS 
emp_first employees.first_name%TYPE, 
emp_last employees.last_name%TYPE, 
emp_dept employees.department_name%TYPE, 
emp_salary employees.salary%TYPE;



BEGIN 
  FOR count IN 1 .. n LOOP 
  FETCH emp_curs INTO emp_first, emp_last, emp_dept, emp_salary; 
  EXIT WHEN emp_curs%NOTFOUND; 
  DBMS_OUTPUT.PUT_LINE((emp_first), (emp_last), (emp_dept), (emp_salary)); 
  END LOOP; 
  RETURN emp_curs%FOUND; 
END fetch_rows; 

PROCEDURE close_curs IS 
BEGIN 
  IF emp_curs%ISOPEN
  THEN CLOSE emp_curs;
  END IF;

END close_curs; 

END cursor_state;

Я пробовал много попыток изменить точки с запятой и разные места для конечных операторов. безрезультатно.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

В вашем коде слишком много глупых ошибок, я их исправил.Внимательно наблюдайте за изменениями.

Пакет

CREATE OR REPLACE PACKAGE cursor_state IS
CURSOR emp_curs IS
  SELECT e.first_name, e.last_name, d.department_name, e.salary
    FROM employees e join departments d
  ON e.department_id = d.department_id;

  PROCEDURE open_curs;
  FUNCTION fetch_rows(n NUMBER DEFAULT 1) RETURN BOOLEAN;
  PROCEDURE close_curs;
END cursor_state;
/

Тело пакета

CREATE OR REPLACE PACKAGE BODY cursor_state IS

     PROCEDURE open_curs IS
     BEGIN
          IF NOT emp_curs%isopen THEN
               OPEN emp_curs;
          END IF;
     END open_curs;

     FUNCTION  fetch_rows(n NUMBER DEFAULT 1) RETURN BOOLEAN IS

          emp_first employees.first_name%TYPE;
          emp_last employees.last_name%TYPE;
          emp_dept departments.department_name%TYPE;
          emp_salary employees.salary%TYPE;
     BEGIN
         FOR count IN 1 .. n LOOP  
               FETCH emp_curs INTO
                    emp_first,emp_last,emp_dept,emp_salary;
               EXIT WHEN emp_curs%notfound;
               dbms_output.put_line(emp_first||','
                                    ||emp_last
                                    ||','
                                    ||emp_dept
                                    ||','
                                    ||emp_salary);

          END LOOP;

          RETURN emp_curs%found;
     END fetch_rows;

     PROCEDURE close_curs IS
     BEGIN
          IF emp_curs%isopen THEN
               CLOSE emp_curs;
          END IF;
     END close_curs;

END cursor_state;
/

Выполнение

SET SERVEROUTPUT ON
DECLARE
     x BOOLEAN;
BEGIN
     cursor_state.open_curs;
     x:=cursor_state.fetch_rows(5);
     cursor_state.close_curs;
END;
/

Результат

Jennifer,Whalen,Administration,4400
Michael,Hartstein,Marketing,13000
Pat,Fay,Marketing,6000
Den,Raphaely,Purchasing,11000
Karen,Colmenares,Purchasing,2500


PL/SQL procedure successfully completed.
0 голосов
/ 15 апреля 2019

Используйте здесь точку с запятой (и используйте тип отделов, поскольку вы объединяете таблицу сотрудников с таблицей отделов):

emp_first employees.first_name%TYPE;
emp_last employees.last_name%TYPE;
emp_dept departments.department_name%TYPE; 
emp_salary employees.salary%TYPE;

Объедините, используя символ канала:

DBMS_OUTPUT.PUT_LINE(emp_first || ' ' || emp_last || ' ' || emp_dept || ' ' || emp_salary);

Определитете же параметры в определении пакета, что и в теле пакета:

FUNCTION fetch_rows(n NUMBER := 1) RETURN BOOLEAN;

Затем попробуйте свой код:

SET SERVEROUTPUT ON
DECLARE
  l_ret BOOLEAN;
BEGIN
  cursor_state.open_curs;
  l_ret := cursor_state.fetch_rows(2);
  cursor_state.close_curs;
END;
/

Пример вывода:

Steven King Executive 24000
Neena Kochhar Executive 17000
 PL/SQL procedure successfully completed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...