2017-05-31 18 views
0

テーブルスタッフの主キーを自動的にシークェンスしようとしました。Oracle DBのトリガー構文

入力:

CREATE SEQUENCE staff_idseq START WITH 1 INCREMENT BY 1 MAXVALUE 9999; 
CREATE TABLE Staff 
(
    staffid   number(4) not null primary key, 
    name   varchar2(21) not null unique, 
    permission  varchar2(10) not null 
); 
CREATE OR REPLACE TRIGGER staff_idtrig 
    BEFORE INSERT ON Staff 
    FOR EACH ROW WHEN (new.staffid is null) 
    BEGIN 
     SELECT staff_idseq.nextval INTO :new.staffid FROM dual; 
    END; 

私はこれをロードするときには、シーケンスとテーブルを作成した後、それは私が行の最後にセミコロンを追加するのを忘れたかのように入力moreコマンドに私を要請します。たぶん私のクエリにいくつかのエラーがありますが、Ctrl + cを使わずに入力プロンプトから抜け出せなかったので、間違いを見つけられませんでした。

+0

Oracle 12.1以降では、 'identityとして生成された' staffid number(4) 'を定義するか、またはシーケンスをデフォルト値として設定します。 –

答えて

1

トリガーは、PL/SQLプログラムで、セミコロンを行終端文字として使用します。したがって、create or replaceステートメントを実行するには、新しい行にスラッシュをつけてコードを完成させる必要があります。

これを試してみてください:

CREATE OR REPLACE TRIGGER staff_idtrig 
    BEFORE INSERT ON Staff 
    FOR EACH ROW WHEN (new.staffid is null) 
BEGIN 
    SELECT staff_idseq.nextval INTO :new.staffid FROM dual; 
END; 
/

を@a_horse_with_no_nameが言うように、あなたは11グラムにしている場合は、この単純な構文を使用しない理由:カバーの下に

:new.staffid := staff_idseq.nextval; 

をOracleがまだselectを実行デュアルでは、それは構文的な砂糖だけです(より少ないタイピング)

+1

またはより簡単です: ':new.staffid:= staff_idseq.nextval;' –

+0

あなたの助けてくれてありがとう!出来た! – CDnX