【问题标题】:Oracle query : Missing Keywords/parenthesisOracle 查询:缺少关键字/括号
【发布时间】:2015-04-15 07:35:48
【问题描述】:

我在 unix 中执行 sql 查询。但我没有发现查询中的错误。

CREATE TABLE flights ( route_id NUMBER(10) NOT NULL, depart_timestamp TIMESTAMP WITH TIME ZONE NOT NULL, arrive_timestamp TIMESTAMP WITH TIME ZONE NOT NULL, base_price_usd NUMBER(17,2) NOT NULL CHECK (base_price_usd > cast(0.0 as clob)::money), status_id INTEGER NOT NULL, PRIMARY KEY (route_id, depart_timestamp), FOREIGN KEY (route_id) REFERENCES routes(route_id), FOREIGN KEY (status_id) REFERENCES route_statuses(status_id) );

第 2 行出现错误:

ORA-00905:缺少关键字

ORA-00907: 缺少右括号

【问题讨论】:

  • 第四行没有意义。为什么将 0 转换为 CLOB?只需使约束 CHECK base_price_usd>0。哦,据我所知,您不能将 TIMESTAMP WITH TIMEZONE 列用作复合主键的一部分。
  • 我已经更改了查询,但在 oracle 8.0.6.3 查询中仍然出现相同的错误:CREATE TABLE 航班(route_id NUMBER(10) NOT NULL,depart_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,arrive_timestamp TIMESTAMP WITH TIME ZONE NOT NULL, base_price_usd NUMBER(17,2) NOT NULL CHECK (base_price_usd > 0), status_id INTEGER NOT NULL, PRIMARY KEY (route_id), FOREIGN KEY (route_id) REFERENCES routes(route_id), FOREIGN KEY (status_id) REFERENCES route_statuses(status_id) );
  • TIMESTAMP WITH TIME ZONE 数据类型在 Oracle 10g 中实现。它在 Oracle 8 中不起作用。
  • 那我用哪种数据类型代替它。
  • 您可以使用简单的 DATE 数据类型。如果确实需要存储时区,至少要迁移到Oracle 10g。

标签: sql oracle


【解决方案1】:

好的,作为anwser发布:

1) 将 CHECK 约束设为 CHECK base_price_usd > 0

2) TIMESTAMP WITH TIME ZONE 数据类型不能用作主键。

3) TIMESTAMP WITH TIME ZONE 在 Oracle 10g 中实现。由于您使用的是 Oracle 8,因此它不会在那里工作。使用DATE 类型。

我想您可以添加一列来存储时区。它可能是 VARCHAR2 并存储诸如“GMT-6”之类的值,但我认为它不值得,因为最新版本的 Oracle 可以默认存储它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多