Не уверен, какое программное обеспечение вы используете для разработки кода PL / SQL.Однако вы должны выяснить, как сделать сообщения об ошибке компиляции видимыми, например,
с помощью sqlcl (инструмент командной строки)
-- just a test table ...
create table purchaseddeal ( id )
as
select 1 from dual ;
CREATE OR REPLACE TRIGGER reminder1
AFTER INSERT OR UPDATE ON PurchasedDeal
FOR EACH ROW
BEGIN
RAISE_APPLICATION_ERROR( 'Notify new Purchased Deal Created or updated' );
END;
/
SQL> show error
Errors for TRIGGER ...REMINDER1:
LINE/COL ERROR
-------- --------------------------------------------------------------------------------------------
2/1 PL/SQL: Statement ignored
2/1 PLS-00306: wrong number or types of arguments in call to 'RAISE_APPLICATION_ERROR'
При использовании https://livesql.oracle.com вы будетеget
-- this will be displayed straightaway after compiling ...
Errors: TRIGGER REMINDER1
Line/Col: 2/1 PL/SQL: Statement ignored
Line/Col: 2/1 PLS-00306: wrong number or types of arguments in call to 'RAISE_APPLICATION_ERROR'
Затем вы можете узнать больше, посмотрев документацию .
RAISE_APPLICATION_ERROR Процедура
Вы можете вызватьПроцедура RAISE_APPLICATION_ERROR (определена в пакете DBMS_STANDARD) только из сохраненной подпрограммы или метода.Как правило, вы вызываете эту процедуру, чтобы вызвать пользовательское исключение и вернуть его код ошибки и сообщение об ошибке вызывающему.
Чтобы вызвать RAISE_APPLICATION_ERROR, используйте следующий синтаксис:
RAISE_APPLICATION_ERROR (код ошибки, сообщение[, {TRUE | FALSE}]);Вы должны присвоить error_code пользовательской исключительной ситуации с прагмой EXCEPTION_INIT.Синтаксис:
PRAGMA EXCEPTION_INIT (имя_исключения, код_ошибки) Код ошибки - это целое число в диапазоне -20000 ..- 20999, а сообщение представляет собой строку символов длиной не более 2048 байтов.
Вероятно, неясно (для вас самих или других программистов), почему вы должны использовать процедуру RAISE_APPLICATION_ERROR, когда все идет по плану, т.е. когда строка была успешно вставлена или ОБНОВЛЕНА.Может быть, следующий пример является лучшей иллюстрацией того, что вы хотели закодировать (или посмотреть):
Таблица: куплен deal
SQL> select * from purchaseddeal ;
PRODUCT_ID QTY PRICE
---------- ---------- ----------
1 10 100
Триггер
-- fires when a price is too high or too low
-- (this could also be coded as a CHECK constraint - but the question is about triggers ...).
create or replace trigger checktheprice
before insert or update on purchaseddeal
for each row
begin
if :new.price < 0 then
raise_application_error( -20000, 'Price too low' ) ;
elsif :new.price > 1000 then
raise_application_error( -20001, 'Price too high' ) ;
end if;
end ;
/
Тестирование
SQL> insert into purchaseddeal values ( 2, 20, 2000 ) ;
Error starting at line : 1 in command -
insert into purchaseddeal values ( 2, 20, 2000 )
Error report -
ORA-20001: Price too high
ORA-06512: at "...CHECKTHEPRICE", line 5
ORA-04088: error during execution of trigger '...CHECKTHEPRICE'
SQL> insert into purchaseddeal values ( 2, 20, -2000 ) ;
Error starting at line : 1 in command -
insert into purchaseddeal values ( 2, 20, -2000 )
Error report -
ORA-20000: Price too low
ORA-06512: at "...CHECKTHEPRICE", line 3
ORA-04088: error during execution of trigger '...CHECKTHEPRICE'
Стол еще не тронут ...
select * from purchaseddeal ;
SQL> select * from purchaseddeal ;
PRODUCT_ID QTY PRICE
---------- ---------- ----------
1 10 100
Анонимный блок и PRAGMA EXCEPTION_INIT
declare
price_too_low exception ;
price_too_high exception ;
-- assign the error_codes to the user-defined exceptions
pragma exception_init( price_too_low, -20000 ) ;
pragma exception_init( price_too_high, -20001 ) ;
begin
insert into purchaseddeal values ( 2, 20, 2000 ) ;
-- insert into purchaseddeal values ( 2, 20, -2000 ) ;
exception
when price_too_low then
dbms_output.put_line( to_char( sqlerrm( -20000 ) ) ) ;
when price_too_high then
dbms_output.put_line( to_char( sqlerrm( -20001 ) ) ) ;
end ;
/
-- output
ORA-20001: Price too high
ORA-06512: at "...CHECKTHEPRICE", line 5
ORA-04088: error during execution of trigger '...CHECKTHEPRICE'
PL/SQL procedure successfully completed.
Еще несколько проверок: значения в допустимом диапазоне
-- insert some rows that contain values in the allowed range
insert into purchaseddeal ( product_id, qty, price )
select
level + 1, ( level + 1 ) * 10, ( level + 1 ) * 100.00
from dual
connect by level <= 8 ;
Таблица теперь содержит ...
SQL> select * from purchaseddeal ;
PRODUCT_ID QTY PRICE
---------- ---------- ----------
1 10 100
2 20 200
3 30 300
4 40 400
5 50 500
6 60 600
7 70 700
8 80 800
9 90 900
9 rows selected.