由于“此处不允许列”错误,插入失败

时间:2015-11-22 01:21:55

标签: sql oracle oracle-sqldeveloper

我是SQL的初学者。我创建了4个表并将数据添加到我的SHIP表中。我在将数据插入CRUISE表时遇到了一些问题。我在底部收到错误消息。

我已经研究过,无法弄清楚我做错了什么。我的序列和/或触发器是否存在不允许我这样做的问题,还是我在CREATE TABLE CRUISE中的语法导致错误?在尝试将第一列插入CRUISE表之前,我所做的一切都已成功完成。

表格:

CREATE TABLE SHIP 
( Ship_Name VARCHAR2(100) PRIMARY KEY,
Ship_Size INTEGER,
Ship_Registry VARCHAR2(50),
Ship_ServEntryDate INTEGER,
Ship_PassCapacity INTEGER,
Ship_CrewCapacity INTEGER,
Ship_Lifestyle VARCHAR2(40),
CONSTRAINT Size_ck CHECK (Ship_Size > 0),
CONSTRAINT Registry_ck CHECK (Ship_Registry IN ('Norway','Liberia','The Netherlands','Bahamas'))
)

CREATE TABLE CRUISE (
Cruise_ID INTEGER Primary Key,
Ship_Name VARCHAR(100),
Cruise_DeptDate DATE NOT NULL,
Cruise_DeptCity VARCHAR(80) NOT NULL,
Cruise_Duration INTEGER,
FOREIGN KEY (Ship_Name) REFERENCES SHIP(Ship_Name)
)

CREATE TABLE PASSENGERS (
Pass_ID INTEGER PRIMARY KEY,
Pass_Name VARCHAR(100) NOT NULL,
Pass_City VARCHAR(80),
Pass_Telephone VARCHAR(15),
Pass_NextOfKin VARCHAR(100)
)

CREATE TABLE RESERVATIONS (
Pass_ID INTEGER NOT NULL,
Cruise_ID INTEGER NOT NULL,
Res_TotalCost NUMERIC(9,2),
Res_BalanceDue NUMERIC(9,2),
Res_SpecialRequest VARCHAR(30),
Res_Room VARCHAR(10),
FOREIGN KEY (Pass_ID) REFERENCES PASSENGERS(Pass_ID),
FOREIGN KEY (Cruise_ID) REFERENCES CRUISE(Cruise_ID),
CONSTRAINT Cost_ck CHECK (Res_TotalCost >= 0),
CONSTRAINT BalanceDue_ck CHECK (Res_BalanceDue >= 0),
CONSTRAINT SpecialRequest_ck CHECK (Res_SpecialRequest IN ('Vegetarian','Vegan','Low salt','Gluten free','Kosher','Other'))
)

序列/触发器是尝试自动编号Cruise_ID。

Create SEQUENCE cruise_id_sq
START WITH 1
INCREMENT BY 1;

CREATE OR REPLACE TRIGGER cruise_id_t
BEFORE INSERT 
ON CRUISE
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
if(:new.Cruise_ID is null) then
SELECT cruise_id_sq.nextval
INTO :new.Cruise_ID
FROM dual;
end if;
END;

ALTER TRIGGER cruise_id_t ENABLE;

插入SHIP是可以的....

INSERT INTO SHIP
(Ship_Name, Ship_Size, Ship_Registry,Ship_ServEntryDate, Ship_PassCapacity,Ship_CrewCapacity,Ship_Lifestyle)
Values ('Carribean Princess',142000,'Liberia',1000,3100,1181,'Contemporary');

INSERT INTO SHIP
(Ship_Name, Ship_Size, Ship_Registry,Ship_ServEntryDate, Ship_PassCapacity,Ship_CrewCapacity,Ship_Lifestyle)
Values ('Carribean Sunshine',74000,'Norway',1992,1950,760,'Premium');

INSERT INTO SHIP
(Ship_Name, Ship_Size, Ship_Registry,Ship_ServEntryDate, Ship_PassCapacity,Ship_CrewCapacity,Ship_Lifestyle)
Values ('Ship of Dreams',70000,'Liberia',2004,1804,735,'Contemporary');

INSERT INTO SHIP
(Ship_Name, Ship_Size, Ship_Registry,Ship_ServEntryDate, Ship_PassCapacity,Ship_CrewCapacity,Ship_Lifestyle)
Values ('Sunshine of the Seas',74000,'The Netherlands',1990,2354,822,'Luxury');

插入CRUISE失败......

INSERT INTO Cruise
(Ship_Name, Cruise_DeptDate,Cruise_DeptCity,CruiseDuration)
Values ('Sunshine of the Seas',25-may-15,'Miami',10);
  

从命令行中的第1行开始出错 - INSERT INTO Cruise(Ship_Name,   Cruise_DeptDate,Cruise_DeptCity,CruiseDuration)值('阳光之城'   the Seas',25-may-15,'Miami',10)命令行出错:3栏:35   错误报告 - SQL错误:ORA-00984:此处不允许列   00984. 00000 - “这里不允许列”   *原因:
  *操作:

1 个答案:

答案 0 :(得分:1)

Oracle认为25-may-15是表达式25减去may减去15.在查找may的值时,Oracle发现那里什么也没有。因此错误。

您可以(但可能不想)引用它,'25-may-15'。这将使一个字符串可能会或可能不会隐式转换为日期,具体取决于NLS_DATE_FORMAT和/ NLS_TERRITORY的设置。

要形成独立于会话设置的日期,可以使用具有明确日期格式to_date('25-may-15', 'DD-Mon-YY')的{​​{3}}函数。另一个选项是TO_DATEdate '2015-05-25',无论会话设置如何,始终为YYYY-MM-DD