44

Oracle 11g Express と SQL Developer で自動インクリメントのようなことをしようとしていました。私は Oracle についてほとんど知識がなく、トリガーも初めてです。

これを実行してみましたが、適切に実行する方法がわかりません。

CREATE TABLE theschema.thetable
(id NUMBER PRIMARY KEY,
name VARCHAR2(30));

CREATE SEQUENCE theschema.test1_sequence
START WITH 1
INCREMENT BY 1;

create or replace trigger insert_nums
before insert on theschema.thetable
for each row
begin
select test1_sequence.nextval into :new.id from dual;
end;
/

トリガーを作成しようとすると、「バインド」を求める画面が表示されます。ダイアログ ボックスには、チェック ボックス「null」が 1 つだけあります。これは何を意味し、適切に動作するスクリプトを作成するにはどうすればよいですか?

この種の「自動インクリメント」を行う際に注意すべきことはありますか?

バインドを入力してください

4

4 に答える 4

52

SQL Developerは、DDL(データ定義)ではなく、プレーンなDML(データ操作)スクリプトを実行していると考えているようです。また、それ:new.idはバインド可能な変数であると考えています。

なぜこれが起こるのか、私にはわかりません。Oracle SQLDeveloper2.1では再現できません。

スキーマで新しいSQLワークシートウィンドウを開き、(not )theschemaを押して「全体」のスクリプト(ステートメントではない)を実行してみてください。F5F9

于 2012-08-28T21:10:38.150 に答える
15

これが私がこの問題を解決した方法です。「set define off;」を置きます。コマンドの前に:

set define off;
create or replace trigger [...]
[...]
end;
/

次に、両方のコマンドを強調表示し、F9 を押して実行します。または、F5 ですべてのコマンドを実行することもできます。

コマンドを F9 で個別に実行すると、set define off が有効にならないようです。

于 2013-09-11T14:13:05.787 に答える
0

私の場合、解決策はバインドの値として「new」に「newrow」、「old」に「oldrow」を入力することでした...

于 2014-01-02T15:13:14.870 に答える