【问题标题】:'Missing right parenthesis' SQL DEVELOPER'缺少右括号' SQL DEVELOPER
【发布时间】:2018-10-23 10:09:25
【问题描述】:

正在做一个学校项目,但在我尝试创建表格时遇到了这个错误。

CREATE TABLE SSV_PASSENGERS ( PASS_ID# CHAR(6),
 PASS_FNAME VARCHAR(15),
 PASS_LNAME VARCHAR(15),
 PASS_ADDRESS VARCHAR(30),
 PASS_NATION VARCHAR(20),
 PASS_DOB DATE(yyyy-mm-dd),
 PASS SATRATE VARCHAR(2),
 PASS_CAB# CHAR(4),
 PASS_CABFARE NUMBER(6,2),
 PASS_TOTALEX  NUMBER(7,2),
 PASS_MEDINFO VARCHAR(30),
 PASS_DIET VARCHAR(30),
 PASS_EMNAME VARCHAR(20),
 PASS_EMPHONE# CHAR(10),
 PASS_ALTID CHAR(5),
 CONSTRAINT SSV_PASSENGERS_PK PRIMARY KEY (PASS_ID#) )

ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号”

谁能告诉我脚本有什么问题?

【问题讨论】:

  • PS 不要使用 varchar,使用 varchar2

标签: oracle oracle-sqldeveloper


【解决方案1】:

错误消息ORA-00907: missing right parenthesis 表示语法错误。有时这意味着我们确实有一个未配对的左括号。但通常这意味着编译器遇到了意外字符,可能是挂起的逗号或意外标识符,编译器将其解释为尝试在未正确关闭当前 CREATE TABLE 语句的情况下启动新语句。

这不直观。但是,现在您知道错误消息的真正含义了,下次收到错误消息时,您应该想一想:啊,我的代码打错了,我必须仔细研究它,直到找到我的灯笼裤时间>。

在这种情况下,我认为问题在于:PASS_DOB DATE(yyyy-mm-dd)

Oracle 以标准结构存储日期:格式掩码仅用于显示为字符串或从字符串转换。

声明 DATE 列的方法很简单:PASS_DOB DATE

另外,您的列名中缺少下划线:它应该是 PASS_SATRATE VARCHAR(2)

【讨论】:

    【解决方案2】:

    据我所知,该语句中的括号是平衡的。是否可能针对某些不同的语句报告错误?

    Oracle 允许将 # 作为列标识符的一部分,但不鼓励这样做。

    Oracle Database Online Documentation, 10g Release 2 (10.2) / Administration: Schema Object Names and Qualifiers 说:

    不带引号的标识符只能包含数据库字符集中的字母数字字符以及下划线 (_)、美元符号 ($) 和井号 (#)。数据库链接还可以包含句点 (.) 和“at”符号 (@)。 Oracle 强烈建议您不要在未加引号的标识符中使用 $ 和 #。

    (强调我的)

    有趣的是,Oracle 12c 文档中的同一段落不包含相同的警告。

    您是否可能在某些将# 视为注释字符(如shell 或Ruby 代码)并忽略# 之后的所有文本的环境中执行create table 语句?

    【讨论】:

      【解决方案3】:

      我发现了一些问题。

      1. DATE (PASS_DOB DATE(yyyy-mm-dd) - 你只需要 DATE
      2. PASS SATRATE VARCHAR(2) - 你需要一个下划线
      3. VARCHAR 与 VARCHAR2 - VARCHAR 支持 ANSI - 始终使用 VARCHAR2

      VARCHAR 数据类型 VARCHAR 数据类型与 VARCHAR2 同义 数据类型。为避免可能的行为变化,请始终使用 VARCHAR2 数据类型存储可变长度的字符串。 (Docs)

      工作代码:

      create table SSV_PASSENGERS (
          PASS_ID# char(6),
          PASS_FNAME varchar2(15),
          PASS_LNAME varchar2(15),
          PASS_ADDRESS varchar2(30),
          PASS_NATION varchar2(20),
          PASS_DOB date,
          PASS_SATRATE varchar(2),
          PASS_CAB# char(4),
          PASS_CABFARE number(6,2),
          PASS_TOTALEX number(7,2),
          PASS_MEDINFO varchar(30),
          PASS_DIET varchar(30),
          PASS_EMNAME varchar(20),
          PASS_EMPHONE# char(10),
          PASS_ALTID char(5),
          constraint SSV_PASSENGERS_PK primary key ( PASS_ID# )
      );
      

      由于您使用并标记了 SQL Developer,因此我们会尝试向您展示您的问题所在,寻找有问题的坏 SQL 附近的粉红色波浪线。

      【讨论】:

        猜你喜欢
        • 2018-05-23
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-29
        • 2016-10-23
        • 1970-01-01
        相关资源
        最近更新 更多