在Apex Oracle SQL中创建表/序列/触发器-ORA-00922 / ORA-00907 / ORA-00922

时间:2018-08-06 07:43:37

标签: sql oracle oracle-apex

使用:Application Express 18.1.0.00.45

请注意:我是Oracle Apex和SQL的新手。 对于一个项目,我必须直接在Apex中创建一个应用程序。

我试图创建一个表,该表与自动递增自身的主键配合使用。

昨天,我创建了我的第一个应用程序,该应用程序的一个页面供用户在表中输入,该页面具有表显示和过滤器选项,并且正在使用表单,仪表板和身份验证方法。 玩完“ Real Work”后,我删除了该应用程序,但是当我意识到自己做错了什么却不确定是什么.. :)

时,我的热情迅速消失了。

经过大量的谷歌搜索/阅读等工作后,我仍然不确定出什么问题。

请参见下面的代码:

-- Create Sequence
CREATE SEQUENCE seq_odm_for_pk
    START WITH 1
    INCREMENT BY 1
    CACHE 100; 


-- Create Table for User Input
CREATE TABLE ODM_Progress_v1 (
    -- General Details:
    ID int NOT NULL AUTO_INCREMENT, 
    TRAINEE varchar(50) NOT NULL, --1
    COACH varchar(50) NOT NULL, --2
    STATUS varchar(50) NOT NULL, --3
    REGION varchar(5) NOT NULL, --4
    -- Actions:
    ACTION_TAKEN varchar(100) NOT NULL, --5
    ACTION_DETAILS varchar(250), --6
    ACTIONED_BY varchar(50) NOT NULL, --7
    ACTIONED_DATE DATE NOT NULL, --8
    -- Constraints that perform checks for each column:
    CONSTRAINT CHK_GeneralDetails CHECK (TRAINEE!=COACH AND (STATUS IN('New', 'In Progress', 'Completed')) AND (REGION IN('EMEA', 'APAC', 'AMER'))),
    -- Set Primary Key (Trainee+Coach):
    CONSTRAINT PK_ODMProgress PRIMARY KEY (TRAINEE,REGION,ID)
); 


-- Create Trigger
CREATE trigger_for_pk_odm_progress
  BEFORE INSERT ON ODM_Progress_v1
  FOR EACH ROW
  WHEN (new.ID is null)
BEGIN
  select seq_odm_for_pk.nextval into :new.ID from DUAL;
  -- :new.PK_ODMProgress := seq_odm_for_pk.nextval;
END;

该脚本以3个错误结束运行,请参见下文:

  

创建或替换序列seq_odm_for_pk从1开始
  每增加1步100

     

ORA-00922:选项丢失或无效

     

创建表ODM_Progress_v1(-常规详细信息:ID int NOT   NULL AUTO_INCREMENT,TRAINEE varchar(50)非NULL,-1 COACH   varchar(50)NOT NULL,--2状态varchar(50)NOT NULL,--3
  REGION varchar(5)NOT NULL,--4-操作:ACTION_TAKEN   varchar(100)NOT NULL,--5 ACTION_DETAILS varchar(250),--6
  ACTIONED_BY varchar(50)NOT NULL,--7 ACTIONED_DATE DATE NOT NULL,   --8-对每一列执行检查的约束:CONSTRAINT CHK_GeneralDetails CHECK(TRAINEE!= COACH AND(STATUS   IN('New','In Progress','Completed'))AND(区域IN('EMEA','APAC',   'AMER'))),-设置主键(学员+教练):CONSTRAINT   PK_ODMProgress主键(TRAINEE,REGION,ID))

     

ORA-00907:缺少右括号

     

在插入之前创建或替换trigger_for_pk_odm_progress   ODM_Progress_v1 FOR EACH ROW WHEN(new.ID为null)BEGIN SELECT   seq_odm_for_pk.nextval INTO:new.ID FROM DUAL; -   :new.PK_ODMProgress:= seq_odm_for_pk.nextval; END;

     

ORA-00922:选项丢失或无效

您能帮我揭开这个(对我来说,完整的)奥秘吗?

最终应用程序应至少包含1个具有主键和顺序的表(从头开始创建,请参见上文),并至少有2页,一个用于数据输入,另一个用于使用使用选项卡或导航菜单的数据显示

提前谢谢!

2 个答案:

答案 0 :(得分:0)

该代码或多或少看起来不错。在这里,您去了:

SQL> CREATE SEQUENCE seq_odm_for_pk
  2      START WITH 1
  3      INCREMENT BY 1
  4      CACHE 100;

Sequence created.

表:我使用的是11g,不支持自动递增的列,因此我删除了该子句:

SQL> CREATE TABLE ODM_Progress_v1 (
  2      -- General Details:
  3      ID int NOT NULL AUTO_INCREMENT,
  4      TRAINEE varchar(50) NOT NULL, --1
  5      COACH varchar(50) NOT NULL, --2
  6      STATUS varchar(50) NOT NULL, --3
  7      REGION varchar(5) NOT NULL, --4
  8      -- Actions:
  9      ACTION_TAKEN varchar(100) NOT NULL, --5
 10      ACTION_DETAILS varchar(250), --6
 11      ACTIONED_BY varchar(50) NOT NULL, --7
 12      ACTIONED_DATE DATE NOT NULL, --8
 13      -- Constraints that perform checks for each column:
 14      CONSTRAINT CHK_GeneralDetails CHECK (TRAINEE!=COACH AND (STATUS IN('New', 'In Progress', 'Completed')) AND (REG
ION IN('EMEA', 'APAC', 'AMER'))),
 15      -- Set Primary Key (Trainee+Coach):
 16      CONSTRAINT PK_ODMProgress PRIMARY KEY (TRAINEE,REGION,ID)
 17  );
    ID int NOT NULL AUTO_INCREMENT,
                    *
ERROR at line 3:
ORA-00907: missing right parenthesis


SQL> l3
  3*     ID int NOT NULL AUTO_INCREMENT,
SQL> c/auto_increment//
  3*     ID int NOT NULL ,
SQL> /

Table created.

触发器在第1行中包含错误:它不是“ trigger_for”,而是“ trigger for”(无下划线):

SQL> CREATE trigger_for_pk_odm_progress
  2    BEFORE INSERT ON ODM_Progress_v1
  3    FOR EACH ROW
  4    WHEN (new.ID is null)
  5  BEGIN
  6    select seq_odm_for_pk.nextval into :new.ID from DUAL;
  7    -- :new.PK_ODMProgress := seq_odm_for_pk.nextval;
  8  END;
  9  /
CREATE trigger_for_pk_odm_progress
       *
ERROR at line 1:
ORA-00901: invalid CREATE command


SQL> l1
  1* CREATE trigger_for_pk_odm_progress
SQL> c/er_/er /
  1* CREATE trigger for_pk_odm_progress
SQL> l
  1  CREATE trigger for_pk_odm_progress
  2    BEFORE INSERT ON ODM_Progress_v1
  3    FOR EACH ROW
  4    WHEN (new.ID is null)
  5  BEGIN
  6    select seq_odm_for_pk.nextval into :new.ID from DUAL;
  7    -- :new.PK_ODMProgress := seq_odm_for_pk.nextval;
  8* END;
SQL> /

Trigger created.

SQL>

所以:

  • 顺序还可以,但是-在大多数情况下,简单的create sequence seq_odm_for_pk;就足够了
  • 对于CREATE TABLE,删除AUTO_INCREMENT(如果您不在12c上)
  • 触发:删除下划线

现在,根据执行这些命令的位置 ,您可能会遇到错误。如果您在Apex SQL Workshop中运行它们,请一一运行它们(并在窗口中仅保留一个命令)。这样做,应该没问题。

此外,我注意到您使用了VARCHAR数据类型-切换为VARCHAR 2

最后,用NOT NULL子句约束主键列是没有用的-默认情况下,主键会强制执行。

从Apex本身开始:描述方式,您应该创建交互式报告;向导将创建一个报告(以查看数据),以及一个 form (以插入/修改/删除数据)。

答案 1 :(得分:0)

您在脚本中运行的查询与您在代码中发布的查询不同,可以在错误文本中读取

用于创建序列的代码应该很好:

CREATE SEQUENCE seq_odm_for_pk
    START WITH 1
    INCREMENT BY 1
    CACHE 100; 

从11g开始,创建表时不能在Oracle中使用AUTO_INCREMENT。甚至没有必要,因为您有一个触发器,使用序列中的nextval填充:new.ID。因此,在您的CREATE TABLE中删除ID的AUTO_INCREMENT,一切都会好起来。

在创建触发器时,您省略了TRIGGER关键字(创建或替换 TRIGGER trigger_for_pk_odm_progress)。 另外,我不确定您是否在创建触发器命令的末尾放置了 END; 。如果没有,放上它。

我希望对您有所帮助:)