ОШИБКА PL / SQL: обнаружен символ «ВСТАВКА» - PullRequest
0 голосов
/ 20 сентября 2018

Итак, я пытаюсь создать простую программу, но у меня появляется ошибка на моей вкладке, и я не знаю почему.Я уже создал свою последовательность и таблицу (Lab1_tab), но не включил их здесь.Зачисление и ученические столы работают нормально.Моя ошибка - первая вставка в строке 18. Точная ошибка PLS-00103: обнаружен символ "INSERT"

DECLARE
v_lname VARCHAR(20);
v_id NUMBER(3);
BEGIN
  SELECT s.last_name
  INTO v_lname
  FROM enrollment e, student s
  WHERE e.student_id = s.student_id
  AND LENGTH(s.last_name) < 9
  GROUP BY s.last_name
  HAVING COUNT(*) = ( SELECT MAX(count(student_id))
            FROM enrollment
            GROUP BY student_id);
EXCEPTION
  WHEN TOO_MANY_ROWS THEN
    v_lname := 'Multiple Names';
END;
INSERT INTO Lab1_tab                        //ERROR
   VALUES(LAB1_SEQ.NEXTVAL, v_lname);
BEGIN
      SELECT s.last_name
      INTO v_lname
      FROM enrollment e, student s
      WHERE e.student_id = s.student_id
      AND LENGTH(s.last_name) < 9
      GROUP BY s.last_name
      having count(*) = ( SELECT MIN(count(student_id))
                        FROM enrollment
                        GROUP BY student_id);
    EXCEPTION 
      WHEN TOO_MANY_ROWS THEN
        v_lname := 'Multiple Names';
    END;
    INSERT INTO Lab1_tab
       VALUES (LAB1_SEQ.NEXTVAL, v_lname);
BEGIN
      SELECT i.last_name
      INTO v_lname
      FROM instructor i, section s
      WHERE s.instructor_id = i.instructor_id
      AND i.last_name NOT LIKE '%s'
      GROUP BY i.last_name
      having count(*) = ( SELECT MIN(count(*))
                        FROM section
                        GROUP BY instructor_id );
    EXCEPTION 
      WHEN TOO_MANY_ROWS THEN
        v_lname := 'Multiple Names';
    END;
    INSERT INTO Lab1_tab
      VALUES (1, v_lname); 
BEGIN
    SELECT i.last_name
    INTO v_lname
    FROM instructor i, section s
    WHERE s.instructor_id = i.instructor_id
    AND i.last_name NOT LIKE '%s'
    GROUP BY i.last_name
    having count(*) = ( SELECT MAX(count(*))
                        FROM section
                        GROUP BY instructor_id );
EXCEPTION 
  WHEN TOO_MANY_ROWS THEN
    v_lname := 'Multiple Names';
END;
INSERT INTO Lab1_tab
    VALUES (LAB1_SEQ.NEXTVAL, v_lname);  
END;
/

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Кажется, что вы пытаетесь выполнить анонимный блок PL / SQL, но закрыли блок на ближайшее время.Т.е. первый END, вы, вероятно, намеревались просто закрыть блок «try-catch», фактически закрыл все это.
Возможно, вас смутил DECLARE, который запускает анонимный блок, но это не начало блока кода - вам все равно нужно BEGIN.
Попробуйте что-то вроде этого:

DECLARE
  v_lname VARCHAR(20);
  v_id NUMBER(3);
BEGIN
  BEGIN
    SELECT s.last_name
    INTO v_lname
    FROM enrollment e, student s
    WHERE e.student_id = s.student_id
    AND LENGTH(s.last_name) < 9
    GROUP BY s.last_name
    HAVING COUNT(*) = ( SELECT MAX(count(student_id))
              FROM enrollment
              GROUP BY student_id);
  EXCEPTION
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab                        //ERROR
     VALUES(LAB1_SEQ.NEXTVAL, v_lname);

  BEGIN
    SELECT s.last_name
    INTO v_lname
    FROM enrollment e, student s
    WHERE e.student_id = s.student_id
    AND LENGTH(s.last_name) < 9
    GROUP BY s.last_name
    having count(*) = ( SELECT MIN(count(student_id))
                        FROM enrollment
                        GROUP BY student_id);
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
     VALUES (LAB1_SEQ.NEXTVAL, v_lname);

  BEGIN
    SELECT i.last_name
    INTO v_lname
    FROM instructor i, section s
    WHERE s.instructor_id = i.instructor_id
    AND i.last_name NOT LIKE '%s'
    GROUP BY i.last_name
    having count(*) = ( SELECT MIN(count(*))
                        FROM section
                        GROUP BY instructor_id );
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
    VALUES (1, v_lname); 

  BEGIN
    SELECT i.last_name
    INTO v_lname
    FROM instructor i, section s
    WHERE s.instructor_id = i.instructor_id
    AND i.last_name NOT LIKE '%s'
    GROUP BY i.last_name
    having count(*) = ( SELECT MAX(count(*))
                        FROM section
                        GROUP BY instructor_id );
  EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
      v_lname := 'Multiple Names';
  END;

  INSERT INTO Lab1_tab
    VALUES (LAB1_SEQ.NEXTVAL, v_lname);  

END;
/

Редактировать :
В общем, если вы сомневаетесь, сосчитайте ваши BEGIN s и END s и посмотрите, совпадают ли числа.:)

0 голосов
/ 20 сентября 2018

После анонимных блоков PL / SQL должен быть символ /, позволяющий выполнять операторы DDL.

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