我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号

Posted

技术标签:

【中文标题】我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号【英文标题】:I'm getting an error on Oracle Apex ORA-00907: missing right parenthesis 【发布时间】:2020-05-11 22:47:05 【问题描述】:

我正在尝试在 Oracle Apex 中运行这段 SQL 片段,并不断收到有关右括号的错误。我试图稍后删除约束或更改表,但我不断遇到相同类型的错误。我似乎无法弄清楚表结构有什么问题,而且我在网上找不到任何有意义的信息。任何帮助将不胜感激,谢谢。下面的代码...

DROP TABLE Employee_T
CASCADE CONSTRAINTS;
DROP TABLE TaxDepartment_T
CASCADE CONSTRAINTS;
DROP TABLE Location_T
CASCADE CONSTRAINTS;



CREATE TABLE Employee_T
(
    EmployeeID NUMBER(11) NOT NULL,
    EmployeeName VARCHAR2(25) NOT NULL,
    EmployeeAddress VARCHAR2(30)    ,
    EmployeeCity VARCHAR2(20)    ,
    EmployeeState CHAR(2)         ,
    EmployeePostalCode VARCHAR2(10)    ,
    CONSTRAINT Employee_PK PRIMARY KEY(EmployeeID),
    CONSTRAINT Employee_FK1 FOREIGN KEY(DepartmentID) REFERENCES (TaxDepartment_T),
    CONSTRAINT Employee_FK2 FOREIGN KEY(BranchID) REFERENCES (Location_T)
);



CREATE TABLE TaxDepartment_T
(
    DepartmentID INTEGER(11) NOT NULL,
    BranchID INTEGER(11) NOT NULL,
    CPAID INTEGER(11) NOT NULL,
    EmployeeID INTEGER(11) NOT NULL,
    BranchName VARCHAR2(50) NOT NULL,
    CONSTRAINT TaxDepartment_PK PRIMARY KEY(DepartmentID, BranchID, CPAID),
    CONSTRAINT TaxDepartment_FK1 FOREIGN KEY(BranchID) REFERENCES (Location_T),
    CONSTRAINT TaxDepartment_FK2 FOREIGN KEY(EmployeeID) REFERENCES (Employee_T)
);



CREATE TABLE Location_T
(
    BranchID INTEGER(11) NOT NULL,
    BranchName VARCHAR2(50) NOT NULL,
    ManagerName VARCHAR2(50) NOT NULL,
    EmployeeID INTEGER(11) NOT NULL,
    CONSTRAINT Location_PK PRIMARY KEY(BranchID),
    CONSTRAINT Location_FK1 FOREIGN KEY(EmployeeID) REFERENCES (Employee_T)
);

【问题讨论】:

integer 可以,但integer(11) 不行。使用number(11)。此外,虽然char(2) 有效,但您应该使用字符串的标准类型varchar2(2) 所有references(table name) 约束都应该是references tablenamereferences tablename (columnname)。为什么税务部门和地点有员工 ID? Employee FK1 和 FK2 还引用了表中没有的 DepartmentIDBranchID 列。 【参考方案1】:

您的外键约束语法已关闭。

它应该是什么样子:

REFERENCES SCHEMA.TABLE (COLUMN)

而你只有:

REFERENCES (COLUMN)

如果您在 SQL Developer 中查看此代码,解析器会立即发现您的问题,甚至只需单击一下即可访问包含用于定义 FK 约束的语法图的文档。

这是你的第一个问题。

bug 的乐趣在于杀死一个只暴露下一个。您不能为尚未创建的表创建 FK 约束。因此,要么您需要先创建基表,要么您需要从 CREATE TABLE 调用中删除 FK 约束,并稍后将它们添加为

alter table TABLE_NAME add constraint CONSTRAINT_NAME foreign key(COLUMN_NAME) references TABLE_NAME2(COLUMN_NAME)

在所有表都已创建后,将所有这些 ALTER TABLE ADD CONSTRAINT 调用放在脚本的末尾。

其他人也注意到您正在使用 INTEGER。

我总是这样做...因为我懒得输入“NUMBER(38,0)”

没关系。但是你不能说 INTEGER(9)。 That makes no sense in Oracle。

【讨论】:

【参考方案2】:

您应该在TaxDepartment_TLocation_T 表中使用NUMBER 而不是INTEGER

【讨论】:

整数也可以,只是Oracle中number(38,0)的别名。 integer 很好,但integer(11) 给出“ORA-00907:缺少右括号”。【参考方案3】:

存在一些语法问题。

integer 可以,但integer(11) 不行。使用number(11)。 (另外,虽然char 是有效类型,但对于avoid unexpected behaviour 的字符串,您应该坚持使用标准varchar2。)

外键约束写成constraint fk references tablename,或者您可以选择在括号中指定引用的列:constraint fk references tablename (columnname)。 (此外,如果您将它们内联编写为列定义的一部分,则可以让数据类型从父级继承。)

Employee FK1 和 FK2 引用了表中没有的 DepartmentID 和 BranchID 列。

如果您想将其作为脚本运行,则需要将父级放在子级之前。

我会这样写:

drop table employee_t cascade constraints;
drop table taxdepartment_t cascade constraints;
drop table location_t cascade constraints;

create table Location_T
( BranchID           number(11) not null constraint Location_PK primary key
, BranchName         varchar2(50) not null
, ManagerName        varchar2(50) not null );

create table TaxDepartment_T
( DepartmentID       number(11) not null
, BranchID           constraint TaxDepartment_Location_FK references location_t not null
, CPAID              number(11) not null
, BranchName         varchar2(50) not null
, constraint TaxDepartment_PK primary key(DepartmentID, BranchID, CPAID) );

create table Employee_T
( EmployeeID         number(11) not null constraint Employee_PK primary key
, EmployeeName       varchar2(25) not null
, EmployeeAddress    varchar2(30)
, EmployeeCity       varchar2(20)
, EmployeeState      varchar2(2)
, EmployeePostalCode varchar2(10)
, DepartmentID       constraint Employee_Department_FK references location_t
, BranchID           constraint Employee_Branch_FK references Location_T );

我认为 Location 或 Tax Department 不应该有 EmployeeId 列,所以我删除了它们 - 如果你认为这是错误的,请说。

就我个人而言,我不会将_T 放在表名的末尾,并且我会避免使用驼峰命名法,因为数据字典不保留它,因此描述表给出了示例:

SQL> @desc location_t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 BRANCHID                                  NOT NULL NUMBER(11)
 BRANCHNAME                                NOT NULL VARCHAR2(50)
 MANAGERNAME                               NOT NULL VARCHAR2(50)

【讨论】:

以上是关于我在 Oracle Apex ORA-00907 上遇到错误:缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章

从 DB2 移植到 ORACLE - ORA-00907:缺少右括号

Oracle Live SQL:ORA-00907:缺少右括号 -

在 oracle 10g 中出现错误 .. 错误:- ORA-00907:缺少右括号

错误:ORA-00907:oracle 缺少右括号

为啥这会导致 oracle 错误? ORA-00907

获取“ORA-00907:缺少右括号”,找不到错误