【问题标题】:Oracle table naming causes issues when inserting dataOracle 表命名导致插入数据时出现问题
【发布时间】:2016-02-18 16:17:23
【问题描述】:

在 Oracle 12c 中,我有一个名为“CONTAINERS”的表,以下查询未能插入数据。

insert  into CONTAINERS (ID,CONTAINER_NAME, HIERARCHY_SUB_TYPES_ID, HIERARCHY_TYPES_ID, SEGMENT_ID, SUB_SEGMENT_ID, USERS_ID_HIERARCHY_OWNER) 
    values  (44,'ContainerName', 1, 1, 1, 1, 1);

错误:

命令行错误:1 列:28 错误报告 - SQL 错误: ORA-02000: 缺少 ) 关键字 02000. 00000 - “缺少 %s 关键字”

但这成功了

insert  into CONTAINERS    values  (3,'ContainerName', 1, 1, 1, 1, 1);

我必须将表从“CONTAINERS”重命名为“CONTAINER”,才能正常工作。

谁能解释我为什么会出现这种行为?

DDL:

  CREATE TABLE "RELANDHIER"."CONTAINERS" 
   (    "ID" NUMBER, 
    "CONTAINER_NAME" VARCHAR2(200 BYTE), 
    "USERS_ID_HIERARCHY_OWNER" NUMBER, 
    "SEGMENT_ID" NUMBER, 
    "SUB_SEGMENT_ID" NUMBER, 
    "HIERARCHY_TYPES_ID" NUMBER, 
    "HIERARCHY_SUB_TYPES_ID" NUMBER
   )

【问题讨论】:

  • 你能发布 CREATE TABLE 语句吗
  • 第一次插入提到 8 列,而您只有 7 个值。您必须指定 8 个值,默认值在这里不起作用。第二次插入不指定列和作品。该表必须具有在第二次插入中起作用的列之一的默认值。
  • @davegreen100 刚刚做了。
  • @MarcoPolo First insert 有 7 列而不是 8 列。请再次检查语句。
  • 不过,我确信这是一个默认值问题。为表格发布“描述”或“创建表格”。

标签: oracle insert


【解决方案1】:

“CONTAINERS”似乎是一个“保留名称”。这是我的测试用例源自你的:

drop table "DEMO"."CONTAINERS";

CREATE TABLE "DEMO"."CONTAINERS" 
   (    "ID" NUMBER, 
    "CONTAINER_NAME" VARCHAR2(200 BYTE), 
    "USERS_ID_HIERARCHY_OWNER" NUMBER, 
    "SEGMENT_ID" NUMBER, 
    "SUB_SEGMENT_ID" NUMBER, 
    "HIERARCHY_TYPES_ID" NUMBER, 
    "HIERARCHY_SUB_TYPES_ID" NUMBER
   );

insert into CONTAINERS (ID,CONTAINER_NAME, HIERARCHY_SUB_TYPES_ID, HIERARCHY_TYPES_ID, SEGMENT_ID, SUB_SEGMENT_ID, USERS_ID_HIERARCHY_OWNER) 
    values  (44,'ContainerName', 1, 1, 1, 1, 1);
insert into "DEMO".CONTAINERS (ID,CONTAINER_NAME, HIERARCHY_SUB_TYPES_ID, HIERARCHY_TYPES_ID, SEGMENT_ID, SUB_SEGMENT_ID, USERS_ID_HIERARCHY_OWNER) 
    values  (44,'ContainerName', 1, 1, 1, 1, 1);

INSERT 仅在我为其添加所有者架构的前缀时才有效。

执行给出:

Table dropped.


Table created.

insert into CONTAINERS (ID,CONTAINER_NAME, HIERARCHY_SUB_TYPES_ID, HIERARCHY_TYPES_ID, SEGMENT_ID, SUB_SEGMENT_ID, USERS_ID_HIERARCHY_OWNER)
                          *
ERROR at line 1:
ORA-02000: missing ) keyword



1 row created.

查看此链接到Oracle 12c new features

【讨论】:

  • 您的回答很有道理。我认为 Oracle 需要更新它的 Oracle SQL Reserved Words 文档。 docs.oracle.com/database/121/SQLRF/ap_keywd001.htm#SQLRF55621
  • 我认为仅引用您的表名也可以解决问题。即插入“CONTAINERS”...
  • 问题是这个查询是由 Hibernate 生成的。对输出没有太多控制。
  • 这一切都归结为良好的建模标准。这就是为什么我们的建模标准为我们所有的表添加了一个应用程序前缀。例如,在我们的 ERP 中,我们所有的表都以“ERP_”为前缀。这可以防止保留字出现任何问题。我们有名为“ERP_DATES”的表,在您的情况下,该表将命名为“ERP_CONTAINERS”。
猜你喜欢
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2020-07-30
  • 2013-06-03
  • 2012-05-18
  • 1970-01-01
  • 2017-03-19
  • 2017-08-23
相关资源
最近更新 更多