2016-01-15 2 views
0

Я попытался выполнить следующую процедуру и получил ошибку PLS-00103.PLS -00103 Ошибка хранимой процедуры Oracle SQL

create or replace PROCEDURE getFlightDetails 
(ticketNumberIn IN integer, fullName OUT varchar2(60), flightNumberOut OUT integer, 
route OUT varchar2(50), durationInHours OUT number(6,4)) 
IS 
BEGIN 
    select  
    pe.FirstName || ' ' || pe.LastName into fullName, 
    fl.FlightNumber into flightNumberOut, 
    fl.DepartureAirport || ' - ' || fl.ArrivalAirport into route, 
    ROUND((fl.ArrivalDate - fl.DepartureDate)*24,1) into durationInHours 
    from Purchase pu 
    inner join Person pe on pe.SSN = pu.SSN 
    inner join Ticket ti on ti.TicketNumber = pu.TicketNumber 
    inner join Flight fl on fl.FlightNumber = ti.FlightNumber 
    where pu.TicketNumber = ticketNumberIn; 
END; 

Что я сделал не так? Я имею в виду, что я уже искал Ошибка, и найденные объяснения не помогли.

ответ

1

Предполагая, что ваш запрос возвращает ровно одну строку, вы хотите только один пункт INTO. Вы не ставите предложение INTO в свою проекцию (список столбцов, которые вы выбираете). Вы также не можете указывать длины параметров только для типа данных.

create or replace PROCEDURE getFlightDetails 
(ticketNumberIn IN integer, fullName OUT varchar2, flightNumberOut OUT integer, 
route OUT varchar2, durationInHours OUT number) 
IS 
BEGIN 
    select  
    pe.FirstName || ' ' || pe.LastName, 
    fl.FlightNumber, 
    fl.DepartureAirport || ' - ' || fl.ArrivalAirport, 
    ROUND((fl.ArrivalDate - fl.DepartureDate)*24,1) 
    into fullName, 
     flightNumberOut, 
     route, 
     durationInHours 
    from Purchase pu 
    inner join Person pe on pe.SSN = pu.SSN 
    inner join Ticket ti on ti.TicketNumber = pu.TicketNumber 
    inner join Flight fl on fl.FlightNumber = ti.FlightNumber 
    where pu.TicketNumber = ticketNumberIn; 
END; 

Не отношусь к вашей проблеме, я бы предложил придумать именование для ваших параметров, что отличает их от имен столбцов и используется последовательно. Имея один параметр, имя которого Out, но не делает то же самое на всех остальных параметрах OUT, вероятно, будет путать. Лично я бы просто использовать p_ префикс для параметров

create or replace PROCEDURE getFlightDetails 
(p_ticketNumberIn IN integer, 
p_fullName OUT varchar2, 
p_flightNumber OUT integer, 
p_route OUT varchar2, 
p_durationInHours OUT number) 

Если вы хотите иметь pin_ и pout_ дифференцировать in и out параметры, которые не были бы неразумными.

+0

Спасибо! Он работает отлично. Я также последовал вашим советам и изменил название параметров. –

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