web-dev-qa-db-ja.com

Oracle Expressでトリガーを作成する

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;
/

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

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

Enter binds

42
bread butter

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

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

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

51
Michael T

これが、この問題を解決した方法です。「set define off」を設定します。コマンドの前:

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

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

コマンドがF9で個別に実行される場合、set define offは有効にならないようです。

15
doki42

私はこれが初めてなので、答えを出す際にはそのことを覚えておいてください。私は問題はコードだと思う

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;

実際にはスクリプトであり、単純なSQLステートメントではありません。したがって、「スクリプトの実行」を実行する必要があります。 SQL Developerでワークシートを開いたときに、上記のようなトリガーのコードがワークシートのどこかにあると、SQL Developerがワークシートで振り返って実行しようとするステートメントを実行しようとしただけであることがわかりました脚本。それを防ぐには、コードをコメントアウトする必要がありました。そして、新しいワークシートを開く必要があるよりもトリガーのコードを実行したい場合は、そこにコードを配置して、RUN SCRIPTを実行します。

0
Rod Hittle

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

0
VolkanT