#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:
-
Никогда не используйте запятые
FROM
в предложении he. Всегда используйте правильный, явный, стандартный, читаемыйJOIN
синтаксис. -
Подзапрос не требуется.
-
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, и вложенный запрос вообще не требуется.