![](/img/trans.png)
[英]Oracle SQL “EXECUTE IMMEDIATE” ORA-00922/06512 Create Table
[英]Create Table / Sequence / Trigger in Apex Oracle SQL - ORA-00922 / ORA-00907 / ORA-00922
使用:Application Express 18.1.0.00.45
請注意:我是Oracle Apex和SQL的新手。 對於一個項目,我必須直接在Apex中創建一個Application。
我試圖創建一個表,該表與自動遞增自身的主鍵一起使用。
昨天,我創建了我的第一個應用程序,該應用程序的一個頁面供用戶在表格中輸入,該頁面具有表格顯示和過濾器選項,並且正在使用表單,儀表板和身份驗證方法。 我在玩完“ 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)NOT NULL,--1 COACH varchar(50)NOT NULL,--2 STATUS varchar(50)NOT NULL,--3
區域varchar(5)非空,--4-操作:ACTION_TAKEN varchar(100)非空,--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(REGION IN('EMEA','APAC','AMER'))),-設置主鍵(Trainee + Coach):CONSTRAINT PK_ODMProgress PRIMARY KEY(TRAINEE,REGION,ID))ORA-00907:缺少右括號
創建或替換trigger_for_pk_odm_progress,然后在ODM_Progress_v1上插入(對於每行)(new.ID為null)之前,從seg_odm_for_pk.nextval開始選擇SELECT: -:new.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;
足夠 現在,這取決於你在那里執行這些命令,你可能會得到錯誤。 如果您在Apex SQL Workshop中運行它們,請一一運行它們(並在窗口中僅保留一個命令)。 這樣做, 應該沒問題 。
另外,我注意到您使用了VARCHAR數據類型-切換到VARCHAR 2 。
最后,用NOT NULL子句約束主鍵列是沒有用的-默認情況下,主鍵會強制執行。
從Apex本身開始:描述方式,您應該創建一個Interactive Report ; 該向導將創建一個報告 (以查看數據)以及一個表單 (以插入/修改/刪除數據)。
您在腳本中運行的查詢與您在代碼中發布的查詢不同,可以在錯誤文本中讀取該查詢。
用於在您的代碼中編寫序列時創建序列的代碼應該很好:
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。 在您創建觸發器命令的末尾。 如果沒有,請放。
希望對您有所幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.