【问题标题】:ORA-00907 DRIVING ME INSANEORA-00907 让我发疯
【发布时间】:2020-02-16 17:49:47
【问题描述】:

我正在尝试完成我的实验室,但我找不到丢失的右括号,它表示我失踪了。我已经完成了课程表,一切都是正确的,但我在其他每个表上都出现错误,有人可以帮忙吗?

CREATE TABLE COURSE(
  CRS_CODE VARCHAR(8) NOT NULL,
  CRS_DESCRIPTION VARCHAR(35) NOT NULL,
  CRS_CREDIT INTEGER DEFAULT 4 NOT NULL CHECK(CRS_CREDIT IN (1,2,3,4)),
  PRIMARY KEY (CRS_CODE));

CREATE TABLE CLASS (
  CRS_CODE VARCHAR(8) NOT NULL,
  CLASS_CODE INTEGER (5) NOT NULL,
  CHECK (CLASS_SECTION IN (0,1,2,3,4,5,6,7,8)),
  CLASS_TIME VARCHAR(25) NOT NULL,
  CLASS_ROOM CHAR(6),
  CRS_CODE REFERENCES COURSE(CRS_CODE),
  PRIMARY KEY (CLASS_CODE));

CREATE TABLE STUDENT(
  STU_NUM INTEGER NOT NULL,
  STU_LNAME VARCHAR(25) NOT NULL,
  STU_FNAME VARCHAR(20) NOT NULL,
  STU_INIT VARCHAR(1),
  STU_DOB DATE,
  STU_HRS INTEGER DEFAULT 0 CHECK (STU_HRS>=0 AND STU_HRS<1000),
  STU_CLASS VARCHAR(2) CHECK (STU_CLASS IN ('Fr', 'So', 'Jr', 'Sr', 'Gr')),
  STU_GPA DECIMAL(3,2) DEFAULT 0.00 CHECK (STU_GPA BETWEEN 0.00 AND 4.00),
  STU_PHONE INTEGER(4),
  PRIMARY KEY (STU_NUM));

CREATE TABLE ENROLL(
  ENROLL_GRADE VARCHAR(1) DEFAULT 'Z' CHECK (ENROLL_GRADE IN('A','B','C','D','F','I','W','Z')),
  STU_NUM INTEGER REFERENCES STUDENT(STU_NUM),
  CLASS_CODE INTEGER (5) REFERENCES CLASS(CLASS_CODE));

【问题讨论】:

标签: sql parentheses ora-00907


【解决方案1】:

评论太长了。

实验室的部分目的是让您了解如何调试代码。学术环境中的试错比“现实世界”中的试错效率高得多。

调试,简化!第一个问题是:错误发生在哪里?它是否发生在第一个表创建中?在第二?等等。您可以通过创建第一个表来确定这一点。然后是前两个表,以此类推。

获得表格后,您可能能够快速发现错误。如果没有,您可以一次注释掉一个列定义。

当你这样做的时候,你会发现至少有两个错误:

  • 在约束中引用但未定义的列。
  • 错误地赋予了长度参数的数据类型。

另外,如果您使用的是 Oracle,建议的字符串类型是 varchar2(),而不是 varchar()

【讨论】:

  • 谢谢,我想弄清楚我哪里出错了,我的第一个表实际上是正确的(当然_但是之后的每个表都给了我 907 错误,我正在使用 sql developer 所以 varchar为那个工作
  • @DudelookslikeaDad 。 . . varchar() 工作。 Oracle 推荐varchar2()
【解决方案2】:

我想你忘记了一个专栏

CREATE TABLE CLASS (
  CRS_CODE VARCHAR(8) NOT NULL,
  CLASS_CODE INTEGER (5) NOT NULL,
  CHECK (CLASS_SECTION IN (0,1,2,3,4,5,6,7,8)),
  CLASS_TIME VARCHAR(25) NOT NULL,
  CLASS_ROOM CHAR(6),
  CRS_CODE REFERENCES COURSE(CRS_CODE),
  PRIMARY KEY (CLASS_CODE));

ORA-00904:“CLASS_SECTION”:无效标识符

【讨论】:

    【解决方案3】:

    这是对代码问题的逐表分析。

    COURSE好的

    CLASS

    CLASS_CODE INTEGER(5) NOT NULL
    

    INTEGER 数据类型不接受长度

    CHECK (CLASS_SECTION IN (0,1,2,3,4,5,6,7,8))
    

    表中不存在列CLASS_SECTION。我猜你的意思是CLASS_CODE

    CRS_CODE REFERENCES COURSE(CRS_CODE)
    

    外键约束的声明应该直接放在定义引用列的行中。

    STUDENT

    STU_PHONE INTEGER(4)
    

    见上

    ENROLL

    CLASS_CODE INTEGER (5)
    

    见上文。


    一旦这些问题得到解决,4个表就可以成功创建了。

    Demo on DB Fiddle

    CREATE TABLE COURSE(
      CRS_CODE VARCHAR(8) NOT NULL,
      CRS_DESCRIPTION VARCHAR(35) NOT NULL,
      CRS_CREDIT INTEGER DEFAULT 4 NOT NULL CHECK(CRS_CREDIT IN (1,2,3,4)),
      PRIMARY KEY (CRS_CODE));
    
    CREATE TABLE CLASS (
      CRS_CODE VARCHAR(8) NOT NULL REFERENCES COURSE(CRS_CODE),
      CLASS_CODE INTEGER NOT NULL CHECK (CLASS_CODE IN (0,1,2,3,4,5,6,7,8)),
      CLASS_TIME VARCHAR(25) NOT NULL,
      CLASS_ROOM CHAR(6),
      PRIMARY KEY (CLASS_CODE)
    );
    
    CREATE TABLE STUDENT(
      STU_NUM INTEGER NOT NULL,
      STU_LNAME VARCHAR(25) NOT NULL,
      STU_FNAME VARCHAR(20) NOT NULL,
      STU_INIT VARCHAR(1),
      STU_DOB DATE,
      STU_HRS INTEGER DEFAULT 0 CHECK (STU_HRS>=0 AND STU_HRS<1000),
      STU_CLASS VARCHAR(2) CHECK (STU_CLASS IN ('Fr', 'So', 'Jr', 'Sr', 'Gr')),
      STU_GPA DECIMAL(3,2) DEFAULT 0.00 CHECK (STU_GPA BETWEEN 0.00 AND 4.00),
      STU_PHONE INTEGER,
      PRIMARY KEY (STU_NUM));
    
    CREATE TABLE ENROLL(
      ENROLL_GRADE VARCHAR(1) DEFAULT 'Z' CHECK (ENROLL_GRADE IN('A','B','C','D','F','I','W','Z')),
      STU_NUM INTEGER REFERENCES STUDENT(STU_NUM),
      CLASS_CODE INTEGER REFERENCES CLASS(CLASS_CODE)
    );
    

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2012-11-02
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2021-04-20
      相关资源
      最近更新 更多