Команда SQL неправильно завершила PL / SQL

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

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

 accept cruiseRange prompt "Enter cruising range: ";

CREATE OR REPLACE PROCEDURE 
   runSqlAndGetManyTuples (cruiseRange NUMBER)
  IS planeName varchar2(20); planeID NUMBER; averageSalary NUMBER;

  CURSOR myTuplesAreHereCursor IS
   SELECT Temp.pName, Temp.pID, Temp.avgSalary INTO planeName, planeID, averageSalary
   FROM (SELECT A.airplaneID AS pID, A.airplaneName AS pName, AVG(E.salary) AS avgSalary
          FROM cskresman.Airplane A, cskresman.Certified C, cskresman.Employees E
          WHERE A.airplaneID = C.airplaneID AND C.employeeID = E.employeeID AND A.cruisingRange > cruiseRange
          GROUP BY A.airplaneID, A.airplaneName) AS Temp;
  

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

1. Вы СОЗДАЕТЕ ИЛИ ЗАМЕНЯЕТЕ процедуру. Я вижу раздел объявлений, включающий недопустимый, как и раньше, псевдоним таблицы. Следующим ОБЯЗАТЕЛЬНЫМ шагом в процедуре является запись тела процедуры (включая ключевое слово BEGIN и команду END; ) — где они? Без них, очевидно, «команда не завершается должным образом».

Ответ №1:

  1. Никогда не используйте запятые FROM в предложении he. Всегда используйте правильный, явный, стандартный, читаемый JOIN синтаксис.

  2. Подзапрос не требуется.

  3. Oracle не поддерживает as псевдонимы таблиц.

Вы можете записать запрос как:

 SELECT A.airplaneID AS pID, A.airplaneName AS pName, AVG(E.salary) AS avgSalary
INTO planeName, planeID, averageSalary
FROM Airplane A JOIN
     Certified C
     ON A.airplaneID = C.airplaneID JOIN
     Employees E
     ON C.employeeID = E.employeeID 
WHERE A.cruisingRange > cruiseRange
GROUP BY A.airplaneID, A.airplaneName;
  

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

1. Спасибо, это было действительно полезно. Я только изучаю Oracle, и мой SQL сейчас довольно дерьмовый, но это многое проясняет.

Ответ №2:

Вы не можете использовать INTO запрос in cursor, а также вы не можете использовать AS псевдоним for таблицы или вложенного запроса.

Ваш запрос курсора должен выглядеть следующим образом:

 CURSOR myTuplesAreHereCursor IS
   SELECT A.airplaneID AS pID, 
          A.airplaneName AS pName, 
          AVG(E.salary) AS avgSalary
    FROM cskresman.Airplane A, 
         cskresman.Certified C, 
         cskresman.Employees E
   WHERE A.airplaneID = C.airplaneID
     AND C.employeeID = E.employeeID 
     AND A.cruisingRange > cruiseRange
GROUP BY A.airplaneID, A.airplaneName;
  

Предложение: всегда используйте стандартные соединения ANSI, и вложенный запрос вообще не требуется.