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」のみがあります。これは何を意味し、適切に動作するスクリプトを作成するにはどうすればよいですか?
この種の「自動インクリメント」を行う際の注意事項はありますか?
SQL Developerは、DDL(データ定義)ではなく、プレーンなDML(データ操作)スクリプトを実行していると考えているようです。また、:new.id
はバインド可能な変数です。
なぜこれが起こるのか、私にはわかりません。 Oracle SQL Developer 2.1では再現できません。
theschema
スキーマで新しいSQLワークシートウィンドウを開いて、「ステートメント」ではなく「全体」スクリプトを実行してみてください。 F5 (ではない F9)。
これが、この問題を解決した方法です。「set define off」を設定します。コマンドの前:
set define off;
create or replace trigger [...]
[...]
end;
/
次に、両方のコマンドを強調表示し、F9を押して実行します。または、F5ですべてのコマンドを実行できます。
コマンドがF9で個別に実行される場合、set define offは有効にならないようです。
私はこれが初めてなので、答えを出す際にはそのことを覚えておいてください。私は問題はコードだと思う
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を実行します。
私の場合、解決策は、バインドの値として「new」に「newrow」、「old」に「oldrow」を入力することでした...