簡體   English   中英

在Apex Oracle SQL中創建表/序列/觸發器-ORA-00922 / ORA-00907 / ORA-00922

[英]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步100

ORA-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; 足夠
  • 對於CREATE TABLE,請刪除AUTO_INCREMENT(如果您不在12c上)
  • 觸發條件:刪除下划線

現在,這取決於你在那里執行這些命令,你可能會得到錯誤。 如果您在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM