コードをチャンクで表示しました。しかし、最初は更新なしで、スクリプトとして一緒に表示したものを実行しているようです:
drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9),
newSalary decimal(10,2),
oldSalary decimal(10,2)
);
create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);
end;
SQL Developerでスクリプトとして実行すると、スクリプト出力ウィンドウに次のように表示されます。
drop table SalUpdates cascade constraints
Error report -
ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
*Cause:
*Action:
Table SALUPDATES created.
Trigger T1 compiled
次に、更新ステートメントをスクリプトに追加する場合:
drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9),
newSalary decimal(10,2),
oldSalary decimal(10,2)
);
create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);
end;
update employee
set salary=4000
where ssn='123456789';
あなたが得る:
Table SALUPDATES dropped.
Table SALUPDATES created.
Trigger T1 compiled
Errors: check compiler log
次に、更新を単独で(スクリプトではなくステートメントとして、またはそのテストを選択してスクリプトとして実行することにより)実行しようとすると、実際に次のようになります。
SQL Error: ORA-04098: trigger 'MYSCHEMA.T1' is invalid and failed re-validation
04098. 00000 - "trigger '%s.%s' is invalid and failed re-validation"
*Cause: A trigger was attempted to be retrieved for execution and was
found to be invalid. This also means that compilation/authorization
failed for the trigger.
*Action: Options are to resolve the compilation/authorization errors,
disable the trigger, or drop the trigger.
user_errors
をクエリする場合 show errors
を表示または実行します 、次のように表示されます:
PLS-00103: Encountered the symbol "UPDATE"
問題は、create trigger
を完了していないことです。 適切にステートメント。 update
同じPL/SQLブロックの一部として表示されています。無効な部分ですが、まだ含まれています。
PL / SQLブロックがある場合は、スラッシュで終了する必要があります。 SQL*Plusのドキュメントで説明されているとおり (これは主にSQL Developerにも当てはまります):
ただし、SQL Developerは、スクリプトの最後のブロックに終了スラッシュがない場合でも文句を言わないため、元のスクリプト(更新なし)は機能します。 SQL * Plusでは、プロンプトが表示されます
。それはある種、そこにあるべきだと推測します-助けようとします。 update
を追加するとき ステートメントはスクリプトの終わりではなくなったため、適用されません。
PL / SQLコードと次のSQL文の間にスラッシュをスクリプトに追加すると、すべて機能します。
drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9),
newSalary decimal(10,2),
oldSalary decimal(10,2)
);
create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);
end;
/
update employee
set salary=4000
where ssn='123456789';
そして今あなたは見る:
Table SALUPDATES dropped.
Table SALUPDATES created.
Trigger T1 compiled
1 row updated.