2015-05-13 4 views
0

Я работаю над созданием хранимой процедуры, которая принимает ввод идентификатора и даты начала и окончания, а затем возвращает отключения, попадающие в этот диапазон. Я просматривал документации оракула, и я думаю, что я близко, но получить несколько ошибок еще:Настройка хранимой процедуры в Oracle

CREATE or replace PROCEDURE chg_per_aircraft 
    (p_aircraft_id IN RCC_AIRCRAFT.aircraft_id, 
    p_start_date IN date, 
    p_end_date IN date, 
    p_ttl_chg_per_acft OUT INTEGER) 

AS            
BEGIN 
    SELECT RCC_AIRCRAFT.aircraft_id, 
     SUM(RCC_CHARTER.distance * RCC_MODEL.charge_per_mile) ttl_chg 
    INTO 
     p_aircraft_id, 
     p_ttl_chg_per_acft 
FROM RCC_AIRCRAFT 
full join RCC_CHARTER 
on RCC_CHARTER.aircraft_id = RCC_AIRCRAFT.aircraft_id 
left 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 
group by RCC_AIRCRAFT.aircraft_id; 


SYS.DBMS_OUTPUT.PUT_LINE(ttl_chg); 
end; 
+0

Какие ошибки вы получаете? –

+0

Запуская этот запрос, мои ошибки: «PL/SQL: анализ блока компиляции завершен» и «PLS-00488: RCC_AIRCRAFT.Aircraft_ID должен быть типом« – dreamerdiver

+0

SYS.DBMS_OUTPUT.PUT_LINE (ttl_chg); не будет выдавать какой-либо вывод при запуске в качестве хранимой процедуры. Вы можете получить вывод при запуске в качестве pl/sql на терминале. –

ответ

2

Ваша первая ошибка определения параметра:

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; 
/

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

+1

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

+1

Да, хотя было бы хорошо, если бы на самом деле был введен идентификатор самолета, так как он группировался бы по этому одиночному идентификатору. –

+0

Я понимаю, что я делал неправильно с прохождением параметра aircraft_id. Спасибо за помощь. Чтобы прояснить ваше утверждение о выходе, я должен создать другой блок pl/sql для получения возвращаемых результатов на консоли или «SET SERVEROUTPUT on»; быть достаточным? – dreamerdiver

Смежные вопросы