Ваша первая ошибка определения параметра:
p_aircraft_id IN RCC_AIRCRAFT.aircraft_id
должен быть
p_aircraft_id IN RCC_AIRCRAFT.aircraft_id%TYPE
Но тогда вы выбираете INTO p_aircraft_id
, который объявляется как параметр IN, поэтому вы не можете установить его на новое значение. Это переменная, которую вы хотите передать, или значение, которое вы хотите получить? Это имеет больший смысл как то, что предоставил вызывающий, вместе с датами, но тогда вам нужно будет использовать его в качестве фильтра в предложении select. Если было больше одного идентификатора самолета, вероятно, если он ограничен только по дате - тогда вы получите несколько результатов назад, что в любом случае было бы ошибкой too_many_rows.
Ваш вывод будет видимым только для сеанса, который настроен для его обработки, так что, возможно, более разумно было бы сделать вызов вызывающему абоненту; но в любом случае должно быть:
DBMS_OUTPUT.PUT_LINE(p_ttl_chg_per_acft);
... ttl_chg
, как существует только в качестве псевдонима столбца, а не переменную PL/SQL.
Если вы передаете в авиастроительной ID, вы можете что-то вроде этого:
CREATE or replace PROCEDURE chg_per_aircraft
(p_aircraft_id IN RCC_AIRCRAFT.aircraft_id%TYPE,
p_start_date IN date,
p_end_date IN date,
p_ttl_chg_per_acft OUT INTEGER)
AS
BEGIN
SELECT SUM(RCC_CHARTER.distance * RCC_MODEL.charge_per_mile) ttl_chg
INTO p_ttl_chg_per_acft
FROM RCC_AIRCRAFT
JOIN RCC_CHARTER
ON RCC_CHARTER.aircraft_id = RCC_AIRCRAFT.aircraft_id
JOIN RCC_MODEL
ON RCC_MODEL.model_code = RCC_AIRCRAFT.model_code
WHERE RCC_CHARTER.trip_date > p_start_date
AND RCC_CHARTER.trip_date < p_end_date
AND RCC_AIRCRAFT.aircraft_id = p_aircraft_id
GROUP BY RCC_AIRCRAFT.aircraft_id;
-- just to debug!
DBMS_OUTPUT.PUT_LINE(p_ttl_chg_per_acft);
END;
/
Я также изменен на внутренние соединения, как это не кажется полезным, чтобы сделать их внешние соединения. Это также будет иметь больший смысл как функция, чем процедура; хотя обертка одного запроса в сохраненной программе может быть ненужной в любом случае, хотя это похоже на присвоение.
Какие ошибки вы получаете? –
Запуская этот запрос, мои ошибки: «PL/SQL: анализ блока компиляции завершен» и «PLS-00488: RCC_AIRCRAFT.Aircraft_ID должен быть типом« – dreamerdiver
SYS.DBMS_OUTPUT.PUT_LINE (ttl_chg); не будет выдавать какой-либо вывод при запуске в качестве хранимой процедуры. Вы можете получить вывод при запуске в качестве pl/sql на терминале. –