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



使用:Application Express 18.1.0.0.45

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

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

昨天,我创建了我的第一个应用程序,其中有一个表中的用户输入页面,一个带有表显示和筛选选项的页面,并且正在处理表单、仪表板和身份验证方法。我在玩完游戏后删除了应用程序,开始了"真正的工作",但当我意识到我做错了什么,但不确定是什么时,我的热情很快就消失了。:(

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

参见以下代码:

-- 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:选项缺失或无效

CREATE TABLE ODM_Progress_v1(--常规详细信息:ID int NOTNULL AUTO_INCREMENT,TRAINEE varchar(50(NOT NULL,--1 COACHvarchar(50(NOT NULL,--2 STATUS varchar(50NOT NULL,--3
REGION varchar(5(NOT NULL;--4--操作:ACTION_TAKENvarchar(100(不为NULL,--5 ACTION_DETAILS varchar(250(,--6
ACTIONED_BY varchar(50(不为NULL,--7 ACTIONED_DATE DATE不为NULL,--8——对每列执行检查的约束:CONSTRAINT CHK_GeneralDetails CHECK(TRAINEE!=COACH AND(STATUSIN("新建"、"进行中"、"已完成"(和(REGION IN("MEA"、"APAC"、,"AMER"((,--设置主键(受训者+教练(:CONSTRAINTPK_ODMProgress主键(受训人员、地区、ID(

ORA-00907:缺少右括号

在插入之前创建或替换trigger_for_pk_odm_progress当(new.ID为空(开始选择时,每行的ODM_Progress_v1seq_odm_for_pk.nextval INTO:新建。来自对偶的ID--:新增。PK_ODMProgress:=seq_odm_for_PK.nextval;结束;

ORA-00922:选项缺失或无效

你能帮我解开这个(对我来说,完整的(谜团吗?

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

提前谢谢!

这段代码看起来或多或少还可以。给你:

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数据类型-切换到VARCHAR2

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

至于Apex本身:按照您描述的方式,您应该创建一个交互式报告;向导将创建一个报告(查看数据(,以及一个表单,(插入/修改/删除数据(。

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

在代码中创建序列的代码应该很好:

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

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

创建触发器时,您忽略了trigger关键字(CREATE OR REPLACEtriggertrigger_for_pk_odm_progress(。此外,我不确定您是否将END。如果没有,就把它放进去。

我希望这有帮助:(

最新更新