Ошибка PLS-00103 при попытке написать процедуру в Oracle SQL Developer - PullRequest
0 голосов
/ 06 апреля 2020

Во-первых, если этот код абсолютно убит, извините. У меня проблемы с некоторым кодом для моего класса программирования баз данных. Смысл кода заключается в том, чтобы сделать так, чтобы, если последняя буква названия курса находилась в определенном диапазоне, она автоматически изменяла оценки всех, зачисленных в этот класс, на определенную оценку. Я собрал код, по сути, пытаясь подставить соответствующие имена столбцов, основываясь на задании, которое я сделал для триггеров, а также на очень простой c процедуре, загруженной профессором. Когда я запускаю его, я получаю множество ошибок PLS-00103, в которых говорится «Обнаружен символ» ([я получаю по одному для каждого из них] курс / раздел / оценки / если), ожидая одно из следующего:: =; .. «Между тем, что я не занимаюсь программированием и не теряю неделю лекций из-за COVID-19, я просто в тупике. Спасибо, что нашли время, чтобы посмотреть на это, и еще раз извините, если он пронизан ошибками. Код выглядит так:

CREATE or replace PROCEDURE grading AS 
begin 
DECLARE
    CURSOR grading_cursor
    IS SELECT student.student_id,
                course.course_name,
                section.section_id,
                grades.grade
       FROM student
    JOIN grades
    ON student.student_id   = grades.student_id
    JOIN section
    ON grades.section_id   = section.section_id
    JOIN course
    ON section.course_id   = course.course_id;

mycoursename VARCHAR(20) course.course_name%type;
    mySectionID number(10) section.section_id%type;
    myGrade varchar(20) grades.grade%type;

begin    

    open grading_cursor;
    loop
        fetch grading_cursor 
        into myFirstName, myLastName,myCourseName, mySectionID, myGrade
        if myCourseName is between '%a' and '%f' then
        then myGrade = 'A'
        elsif myCourseName is between '%g' and '%k' then
        then myGrade = 'B'
        elsif myCourseName is between '%l' and '%p' then
        then myGrade = 'C'
        elsif myCourseName is between '%q' and '%t' then
        then myGrade = 'D'
        elsif myCourseName is between '%u' and 'z' then
        then myGrade = 'E'
        EXIT WHEN grading_cursor%notfound; 
        end loop; 
    close grading_cursor;
end;

end;

1 Ответ

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

Код, который вы написали, скомпилировался бы, если бы он выглядел следующим образом:

CREATE OR REPLACE PROCEDURE grading
AS
   CURSOR grading_cursor
   IS
      SELECT student.student_id,
             course.course_name,
             section.section_id,
             grades.grade
        FROM student
             JOIN grades ON student.student_id = grades.student_id
             JOIN section ON grades.section_id = section.section_id
             JOIN course ON section.course_id = course.course_id;

   mystudent_id  student.student_id%TYPE;
   mycoursename  course.course_name%TYPE;
   mySectionID   section.section_id%TYPE;
   myGrade       grades.grade%TYPE;
BEGIN
   OPEN grading_cursor;

   LOOP
      FETCH grading_cursor
         INTO mystudentid,
              myCourseName,
              mySectionID,
              myGrade;

      EXIT WHEN grading_cursor%NOTFOUND;

      IF myCourseName BETWEEN '%a' AND '%f'
      THEN
         myGrade := 'A';
      ELSIF myCourseName BETWEEN '%g' AND '%k'
      THEN
         myGrade := 'B';
      ELSIF myCourseName BETWEEN '%l' AND '%p'
      THEN
         myGrade := 'C';
      ELSIF myCourseName BETWEEN '%q' AND '%t'
      THEN
         myGrade := 'D';
      ELSIF myCourseName BETWEEN '%u' AND 'z'
      THEN
         myGrade := 'E';
      END IF;
   END LOOP;

   CLOSE grading_cursor;
END;
/

То, что вы сделали неправильно, было

  • с именем PL / SQL процедуры не имеют DECLARE ключевое слово
  • переменные, которые наследуют тип данных из столбца не может иметь явно с именем типа данных
  • , если курсор содержит некоторый набор столбцов, вы можете не извлекайте его в другой (необъявленный) набор переменных (например, вы не выбираете ни имя, ни фамилию, но все же извлекаете эти незадекларированные переменные), в то время как student_id опущено
  • if требует end if
  • вы удвоили все then с
  • при установке значения переменной, вы должны использовать :=, а не просто =
  • пропущенная точка с запятой ; терминатор команды в IF s

Однако , учтите этот - более простой - вариант:

CREATE OR REPLACE PROCEDURE grading
AS
   myGrade  grades.grade%TYPE;
BEGIN
   FOR cur_r
      IN (SELECT LOWER (SUBSTR (course.course_name, -1)) last_char
            FROM student
                 JOIN grades ON student.student_id = grades.student_id
                 JOIN section ON grades.section_id = section.section_id
                 JOIN course ON section.course_id = course.course_id)
   LOOP
      myGrade :=
         CASE
            WHEN cur_r.last_Char BETWEEN 'a' AND 'f' THEN 'A'
            WHEN cur_r.last_Char BETWEEN 'g' AND 'k' THEN 'B'
            WHEN cur_r.last_Char BETWEEN 'l' AND 'p' THEN 'C'
            WHEN cur_r.last_Char BETWEEN 'q' AND 't' THEN 'D'
            WHEN cur_r.last_Char BETWEEN 'u' AND 'z' THEN 'E'
         END;
   END LOOP;
END;
  • it использует курсор FOR l oop, что проще, так как Oracle многое делает для вас (открытие курсора, выборка из него, внимание о выходе из l oop, закрытии курсора)
  • Я удалил столбцы, которые вы не используете
  • , так как вы хотите проверить последний символ, это то, что я действительно делаю. Проверка, является ли что-то между , с подстановочным знаком %, не лучший вариант

Посмотрите, поможет ли это.

...