Oracle 这些错误是什么意思?您建议我如何修复它们?

Oracle 这些错误是什么意思?您建议我如何修复它们?,oracle,Oracle,我刚开始学习SQL,目前正在课堂上学习。我正在尝试编写满足以下要求的代码: 预订:输入参数:酒店、客人姓名、开始日期、结束日期、房间类型、预订日期。输出:预订ID。注意:每个预订只有一位客人。但是,同一位客人可以进行多次预订 查找预订:输入是客人的姓名和日期、酒店ID。输出是预订ID 我对破译错误代码还是有点陌生,并试图查找它们的含义。然而,我仍然不太清楚为什么我的代码是错误的 CREATE OR REPLACE PACKAGE hotelmanagement AS FUNCTION ma

我刚开始学习SQL,目前正在课堂上学习。我正在尝试编写满足以下要求的代码:

预订:输入参数:酒店、客人姓名、开始日期、结束日期、房间类型、预订日期。输出:预订ID。注意:每个预订只有一位客人。但是,同一位客人可以进行多次预订

查找预订:输入是客人的姓名和日期、酒店ID。输出是预订ID

我对破译错误代码还是有点陌生,并试图查找它们的含义。然而,我仍然不太清楚为什么我的代码是错误的

CREATE OR REPLACE PACKAGE hotelmanagement AS

  FUNCTION make(rsrv_id    VARCHAR2
               ,hotel_name VARCHAR2
               ,guest      VARCHAR2
               ,start_date VARCHAR2
               ,end_date   VARCHAR2
               ,room_type  VARCHAR2
               ,rsrv_date  VARCHAR2)
  
   RETURN NUMBER IS
    rsrv_id NUMBER;
  BEGIN
    SELECT rsrv_seq.nextval INTO reserve_id FROM dual;
    INSERT INTO reservations
    VALUES
      (reserve_id, 'Four Seasons', 'Amanda', 'July-30-2019', 'Aug-8-2019',
       'King', 'July-18-2019');
    tot_rsrv := tot_rsrv + 1;
    RETURN(rsrv_id);
  END;

  FUNCTION find(guest     VARCHAR2
               ,rsrv_date VARCHAR2)
  
   RETURN NUMBER IS
    rsrv_id NUMBER;
  
  BEGIN
    SELECT rsrv_id
      INTO guest
      FROM reservations
     WHERE rsrv_date = find_rsrv_date;
  END;
  RETURN(rsrv_id);
END hotelmanagement;
我有以下错误消息(其中两条看起来相同?):

错误(4,1):PLS-00103:在预期以下情况之一时遇到符号“选择”:开始函数pragma过程子类型当前光标删除在符号“开始”替换为“选择”之前存在,以继续

错误(5,1):PLS-00103:在预期以下情况之一时遇到符号“RSRV_ID”:语言

错误(5,1):PLS-00103:在预期以下情况之一时遇到符号“RSRV_ID”:语言


要求非常模糊,因此很难提供所需的程序。无论如何,您的代码有一些弱项

  • 您的过程有几个输入参数,但在过程中不使用它们
  • 使用适当的数据类型,即从不(!)以字符串形式存储日期或数字值,即
    VARCHAR2
    。仅对字符串数据使用
    VARCHAR2
    。至少你使用四位数的年份,这是正确的方法
  • RETURN
    命令不使用括号
考虑到所有这些因素,您的代码应该大致如下:

CREATE OR REPLACE PACKAGE BODY hotelmanagement AS

  FUNCTION make( -- you can't declare variable "rsrv_id" twice 
               hotel_name IN VARCHAR2
               ,guest     IN VARCHAR2
               ,start_date IN DATE
               ,end_date   IN DATE
               ,room_type  IN VARCHAR2
               ,rsrv_date  IN DATE)    
   RETURN NUMBER IS

    rsrv_id NUMBER;

  BEGIN
    INSERT INTO reservations
    VALUES
      (rsrv_seq.nextval, hotel_name, guest, start_date, end_date,
       room_type, rsrv_date)
    RETURNING reserve_id INTO rsrv_id ;
    -- tot_rsrv := tot_rsrv + 1; -> I don't see any use for it, variable tot_rsrv is not declared
    RETURN rsrv_id;

  END;


  FUNCTION find(v_guest  IN VARCHAR2
               ,rsrv_date IN DATE) RETURN NUMBER IS

    rsrv_id NUMBER;

  BEGIN
    SELECT rsrv_id
    INTO rsrv_id
    FROM reservations
    WHERE rsrv_date = find_rsrv_date
        and guest = v_guest; -- don't use "guest = guest" because this will select all rows.

    RETURN rsrv_id;
  END;

END hotelmanagement;

嗯,你确定MySQL标签是对的吗?看起来更像Oracle…insert语句需要指定要插入的列。@Boneist,insert的列不是必需的,但确实强烈建议使用。是的,但在生产代码中,应该始终指定它们。这只是一个很好的实践,如果有人添加了一个列而没有更新代码,它将避免bug。