Триггер предупреждение - PullRequest
       2

Триггер предупреждение

0 голосов
/ 02 декабря 2018

Я довольно новичок в том, что касается SQL, и в настоящее время я работаю над триггерами, и у меня есть триггер, я не уверен, в чем проблема.Мне было интересно, если кто-нибудь может помочь мне понять, что не так.По правде говоря, я даже не уверен, хороший ли это триггер или нет.У меня небольшие проблемы с ними.Спасибо.Я ценю это.

Триггер, вызывающий ошибку при новой или обновленной покупке

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;

Все, что он говорит, это:

Предупреждение: триггер создан с ошибками компиляции.

1 Ответ

0 голосов
/ 02 декабря 2018

Не уверен, какое программное обеспечение вы используете для разработки кода 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. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...