错误ORA-01722:无效号码ORA-06512:at";SYS.DBMS_SQL";,第1721行

错误ORA-01722:无效号码ORA-06512:at";SYS.DBMS_SQL";,第1721行,sql,oracle,Sql,Oracle,我使用创建了以下表格和约束 奥克胡酒店(ht胡编号,ht胡名称,ht胡城市) oak_客人(gt_编号,gt_姓名,gt_地址) 橡木房(房间号、房间号、房间类型、房间价格) oak_预订(htbk_编号、gtbk_编号、bk_日期从、bk_日期到、人民币K_编号) 制约因素有: 橡木房的客房类型应限制为“单人房”或“双人房”或“家庭房” bk_dateFrom和bk_dateto不应小于当前日期(通过实现触发器实现) 最后,如上图所示,主键和外键(如适用) 用于创建表和约束的SQL语句

我使用创建了以下表格和约束

  • 奥克胡酒店(ht胡编号,ht胡名称,ht胡城市)
  • oak_客人(gt_编号,gt_姓名,gt_地址)
  • 橡木房(房间号、房间号、房间类型、房间价格)
  • oak_预订(htbk_编号、gtbk_编号、bk_日期从、bk_日期到、人民币K_编号)
制约因素有:

  • 橡木房的客房类型应限制为“单人房”或“双人房”或“家庭房”
  • bk_dateFrom和bk_dateto不应小于当前日期(通过实现触发器实现)
  • 最后,如上图所示,主键和外键(如适用)
用于创建表和约束的SQL语句如下:

CREATE TABLE oak_Hotel (
ht_no int NOT NULL,
ht_name varchar(25),
ht_city varchar(25),

CONSTRAINTS PK_hotel PRIMARY KEY(ht_no)
);

CREATE TABLE oak_Guest (
gt_no int NOT NULL,
gt_name varchar(25),
gt_address varchar(25),

CONSTRAINTS PK_guest PRIMARY KEY(gt_no)
);

CREATE TABLE oak_Room (
rm_no int NOT NULL UNIQUE, 
htrm_no int NOT NULL,
rm_type varchar(25),
rm_price NUMERIC(6, 2),

CONSTRAINTS PK_room PRIMARY KEY (rm_no, htrm_no),
CONSTRAINTS FK_guest FOREIGN KEY (htrm_no) REFERENCES 
oak_Hotel(ht_no)
);

ALTER TABLE oak_Room
ADD CONSTRAINT CHK_Oak_room CHECK ((rm_type='Single' OR 
rm_type='DOUBLE' OR rm_type='Family') AND (rm_price>=100 
AND rm_type<=1000) AND (rm_no>=1 AND rm_no<=100));

CREATE TABLE oak_Booking (
htbk_no int NOT NULL,
gtbk_no int NOT NULL,
bk_dateFrom date NOT NULL,
bk_dateto date,
rmbk_no int,

CONSTRAINTS PK_booking PRIMARY KEY (htbk_no, gtbk_no, bk_dateFrom),
CONSTRAINTS FK_booking_htno FOREIGN KEY (htbk_no) REFERENCES oak_Hotel(ht_no),
CONSTRAINTS FK_booking_gtno FOREIGN KEY (gtbk_no) REFERENCES oak_Guest(gt_no),
CONSTRAINTS FK_booking_rmno FOREIGN KEY (rmbk_no) REFERENCES oak_Room(rm_no)
);

CREATE OR REPLACE TRIGGER trg_check_dates
  BEFORE INSERT OR UPDATE ON oak_Booking
  FOR EACH ROW
BEGIN
  IF( :new.bk_dateFrom < SYSDATE )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 
         'Invalid DA=ateFrom: CloseDate must be greater than the current date - value = ' || to_char( :new.bk_dateFrom, 'YYYY-MM-DD HH24:MI:SS' ) );
  END IF;
  IF( :new.bk_dateto <= SYSDATE )
  THEN
   RAISE_APPLICATION_ERROR( -20001, 
         'Invalid DA=ateFrom: CloseDate must be greater than the current date - value = ' || to_char( :new.bk_dateto, 'YYYY-MM-DD HH24:MI:SS' ) );
 END IF;
END;
执行以下语句时会弹出错误

-- ****** Hotel Room ******

INSERT INTO oak_Room
VALUES (1, 1234, 'Single', 100.00);

ORA-01722: invalid number ORA-06512: at "SYS.DBMS_SQL", line 1721
有约束的问题

您使用了
rm\u类型
-- ****** Hotel Room ******

INSERT INTO oak_Room
VALUES (1, 1234, 'Single', 100.00);

ORA-01722: invalid number ORA-06512: at "SYS.DBMS_SQL", line 1721
ALTER TABLE oak_Room
ADD CONSTRAINT CHK_Oak_room CHECK ((rm_type='Single' OR 
rm_type='DOUBLE' OR rm_type='Family') AND (rm_price>=100 
AND rm_price<=1000) AND (rm_no>=1 AND rm_no<=100));