【问题标题】:PLS -00103 Error Stored Procedure Oracle SQLPLS -00103 错误存储过程 Oracle SQL
【发布时间】:2016-01-15 17:21:22
【问题描述】:

我尝试编译以下程序并得到 PLS-00103 错误。

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;

我做错了什么?我的意思是,我已经搜索了错误,但找到的解释并没有太大帮助。

【问题讨论】:

    标签: sql oracle stored-procedures procedure


    【解决方案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_ 来区分inout 参数,那也不是不合理的。

    【讨论】:

    • 谢谢!它工作得很好。我也听从了你的建议,更改了参数的名称。
    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多