此处不允许使用 Oracle 列默认值 [重复]

Posted

技术标签:

【中文标题】此处不允许使用 Oracle 列默认值 [重复]【英文标题】:Oracle Column Not Allowed Here Default Value [duplicate] 【发布时间】:2015-11-02 12:24:11 【问题描述】:

问题在于第 4 行使用序列的 DEFAULT 值。

    CREATE OR REPLACE SEQUENCE CHANNEL_SEQ START WITH 1 INCREMENT BY 1;

    CREATE TABLE "CHANNEL" (  
    "ID_CHANNEL" NUMBER(18,0) DEFAULT CHANNEL_SEQ.NEXTVAL,  
    "IS_ACTIVE" VARCHAR2(1 CHAR) NOT NULL,  
    "BATCH_SIZE" NUMBER(3,0) NOT NULL,
    "MAX_DOCS_IN_PROCESS" NUMBER(4,0) NOT NULL,
    "RECEIVER_ID" NUMBER(18,0) NOT NULL,
    "LAST_POS_SESSION_TIME" DATE,
     CONSTRAINT "PK_CHANNEL" PRIMARY KEY ("ID_CHANNEL"),
     CONSTRAINT "FK_RECEIVER_ID_CHANNEL" FOREIGN KEY ("RECEIVER_ID") REFERENCES   "MSG_OUT"("MSG_OUT_ID"),
     CONSTRAINT "CHK_IS_ACTIVE" CHECK (IS_ACTIVE IN ('Y', 'N'))
   );

错误信息是:

“SQL 错误:ORA-00984:此处不允许列”

欢迎所有帮助和提示。

【问题讨论】:

您使用的是哪个版本的 Oracle? @LalitKumarB 我不同意这个问题是重复的。这个关于列语法和问题的问题主要与不同版本的 oracle 允许或不允许这种语法的事实有关。这应该是这里的答案。现在,如何做到这一点 - 在此处的一个答案和链接的问题中进行了解释。所以,一个问题是如何,另一个问题是为什么 【参考方案1】:

您不能使用seq.NEXTVAL 作为默认值。

为此(自动填充)您应该创建触发器,例如

CREATE OT REPLACE TRIGGER 
BEFORE INSERT 
ON CHANNEL
FOR EACH ROW
BEGIN
:NEW.ID_CHANNEL:=CHANNEL_SEQ.NEXTVAL;
END;

【讨论】:

@您的回答仅与某些版本的 Oracle 相关 仅在 Oracle 12g 之前。他们稍后添加了对此的支持。

以上是关于此处不允许使用 Oracle 列默认值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00984: 此处不允许列动态 sql

Oracle数据库主键约束与唯一索引有啥区别?

Oracle如何取出某一列的所有不重复值作为单独一列

oracle sql语句

Oracle数据库语句

SQL ALTER TABLE MODIFY 语句