使用: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步100ORA-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页,一个用于数据输入,另一个用于使用使用选项卡或导航菜单的数据显示
提前谢谢!
答案 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;
就足够了现在,根据执行这些命令的位置 ,您可能会遇到错误。如果您在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; 。如果没有,放上它。
我希望对您有所帮助:)