【问题标题】:Oracle 11g R2 Express, Auto Increment in lowercaseOracle 11g R2 Express,小写自动增量
【发布时间】:2016-01-07 03:50:34
【问题描述】:

我对小写的自动增量有疑问。基于这个Auto Increment for Oracle 问题,我可以创建自动增量,但表格仍然是大写字符。

我怎样才能真正做到小写。

这是我的 SQL 列表:

CREATE TABLE  "myTable" 
   (    "tableID" NUMBER(*,0) primary key, 
        "tableColumn" VARCHAR2(30) 
   ) ;

CREATE SEQUENCE "tableID_SEQUENCE"
START WITH 1
INCREMENT BY 1;

CREATE OR REPLACE TRIGGER "tableID_TRIGGER"
BEFORE INSERT ON "myTable"
FOR EACH ROW
BEGIN
SELECT tableID_SEQUENCE.nextval INTO NEW.tableID FROM dual; //at this line, what changes needed to?
END;

INSERT INTO "myTable" ("tableColumn") VALUES ('ABC');

所以目前我被困在触发器查询中:

SELECT tableID_SEQUENCE.nextval INTO NEW.tableID FROM dual; 

【问题讨论】:

  • 你混淆了两个非常不相关的东西:序列和标识符命名规则。

标签: sql oracle oracle11g


【解决方案1】:

在 Oracle 数据库中,即使您使用双引号,对象也不区分大小写(它们的名称)。根据 Oracle 文档:

您可以使用带引号或不带引号的标识符来命名任何数据库对象。但是,数据库名称、全局数据库名称和数据库链接名称始终不区分大小写并以大写形式存储。如果您将此类名称指定为带引号的标识符,则引号将被忽略。

【讨论】:

    【解决方案2】:

    编辑:试图更准确地回答。

    您需要在“NEW”变量前面加上一个冒号,并在引号中引用对象名称(因为您使用了引号):

    CREATE OR REPLACE TRIGGER "tableID_TRIGGER"
       BEFORE INSERT
       ON "myTable"
       FOR EACH ROW
    BEGIN
       SELECT "tableID_SEQUENCE".NEXTVAL INTO :NEW."tableID" FROM DUAL;
    END;
    /
    

    您需要使用 - 引号引用所有带引号的名称!:

    "tableID" <> tableID
    "tableID" <> TABLEID
    "tableID" <> tableid
    "tableID" = "tableID"
     tableID  =  tableID
     tableID  =  TABLEID
     tableID  =  tableid
    

    所以除非你真的需要区分大小写,否则不要在对象命名中使用引号。

    【讨论】:

    • Jon Tofte,您编写的第一个代码似乎运行良好。 “从 DUAL 中选择“tableID_SEQUENCE”.NEXTVAL INTO l_seqval;:新。“tableID”:= l_seqval;”谢谢。
    • 确实如此,但上面的方法更简单,更接近问题。
    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 2017-07-01
    • 2015-02-22
    • 1970-01-01
    • 2019-03-11
    • 2019-09-04
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多