Ошибка при создании процедуры с существующим запросом - PullRequest
1 голос
/ 14 апреля 2020

У меня есть запрос, который я пытаюсь использовать в процедуре. Запрос работает точно так, как и должен, но как только я помещаю его в начало и конец процедуры, он говорит мне: «имя уже используется существующим объектом». Не уверен, что это значит, любая помощь будет отличной. Вот оригинальный запрос:

SELECT
        course.course_no,
        course.description,
        section.section_no,
        enrcount.countofenrollment
    FROM
        course
        INNER JOIN section ON course.course_no = section.course_no
        INNER JOIN (
            SELECT
                section_id,
                COUNT(*) countofenrollment
            FROM
                enrollment
            GROUP BY
                section_id
        ) enrcount ON section.section_id = enrcount.section_id
    WHERE
        enrcount.countofenrollment < 6;

Вот процедура:

CREATE PROCEDURE PRC_Enrollment 
AS 
BEGIN
    SELECT
        course.course_no,
        course.description,
        section.section_no,
        enrcount.countofenrollment
    FROM
        course
        INNER JOIN section ON course.course_no = section.course_no
        INNER JOIN (
            SELECT
                section_id,
                COUNT(*) countofenrollment
            FROM
                enrollment
            GROUP BY
                section_id
        ) enrcount ON section.section_id = enrcount.section_id
    WHERE
        enrcount.countofenrollment < 6;
END;

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Прежде всего, необходимо добавить предложение INTO, чтобы вернуть значения столбцов

CREATE OR REPLACE PROCEDURE PRC_Enrollment AS 
   v_course_no   course.course_no%type;
   v_description course.description%type;
   v_section_no  section.section_no%type;
   v_count_enrl  int;
BEGIN
  SELECT c.course_no, c.description, s.section_no, e.countofenrollment
    INTO v_course_no, v_description, v_section_no , v_count_enrl
    FROM course c
    JOIN section s
      ON c.course_no = s.course_no
    JOIN (SELECT section_id, COUNT(*) countofenrollment
            FROM enrollment
           GROUP BY section_id) e
      ON s.section_id = e.section_id
   WHERE e.countofenrollment < 6;
 EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
END;
/

В качестве альтернативы вы можете вернуть эти значения как параметры out, используя вместо этого

CREATE OR REPLACE PROCEDURE PRC_Enrollment(
                                        v_course_no   out course.course_no%type,
                                        v_description out course.description%type,
                                        v_section_no  out section.section_no%type,
                                        v_count_enrl  out int
                                       ) AS 

возвращать их как локальные переменные, как в первом случае.

  • псевдоним ваших таблиц с буквой, обычно предпочитается первая буква таблиц
  • добавить обработку исключений, по крайней мере, против если не найдены данные, чтобы не получить ошибку

Кстати, вы получите такую ​​ошибку , если OR REPLACE не было добавлено после ключевого слова CREATE для второй и последующие сборники.

0 голосов
/ 14 апреля 2020

Используйте create or replace procedure.. вместо create procedure.. для устранения ошибки, упомянутой выше. Это означает, что имя процедуры уже было использовано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...