2015-10-28 2 views
0

Мне сложно понять, как реализовать триггер before insert с помощью курсора, который будет сравнивать номер вставки с max value таблицы 1 столбцов (NUM), а затем распечатать соответствующее сообщение. Любая помощь будет принята с благодарностью.Создать триггер с помощью курсора

create or replace trigger MAXSOME 
    before insert on SOMENUMBERS for each row 
declare 
    cursor pointer is 
    select max(NUM) from SOMENUMBERS; 

    x number; 
begin 
    x := :new.NUM; 

    if x > pointer.num then 
     dbms_output.put_line('The new number ' || x || ' is greater than the greatest number in the table.'); 
    elsif x := pointer then 
     dbms_output.put_line('The new number ' || x || ' is the same as the greatest number in the table.'); 
    else 
     dbms_output.put_line(pointer.num || ' is still the largest number in the table.'); 
    end if; 
end; 
/

ответ

0

Если вы указали курсор, вам нужно открыть его в цикле, но вам даже не нужен курсор. Использование dbms_output не будет работать очень хорошо, поскольку один сеанс может вставляться, и вы можете ожидать выхода с помощью другого сеанса. Создайте еще одну таблицу и зарегистрируйте вывод там.
Я вижу, что Наклс предлагает автономную транзакцию, но мой тестовый пример преуспел без него.

create or replace trigger MAXSOME 
before insert on SOMENUMBERS 
for each row 
declare 

    x SOMENUMBERS.NUM%TYPE; 
begin 
    select max(NUM) into x from SOMENUMBERS; 


    if x > :new.NUM then 
     dbms_output.put_line('The new number ' || :new.NUM || ' is greater than the greatest number in the table.'); 
    elsif x = :new.NUM then 
     dbms_output.put_line('The new number ' || :new.NUM || ' is the same as the greatest number in the table.'); 
    else 
     dbms_output.put_line(:new.NUM || ' is still the largest number in the table.'); 
    end if; 
end; 
+0

Мне было бы интересно узнать прецедент для такого запроса. В любом случае вы не можете выполнить эту операцию против таблицы, триггер которой определяется без использования pragma_autonomous_transaction http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/autotransaction_pragma.htm – knuckles

+0

Спасибо за ваши ответы. Это для заданий, данных в школе, чтобы использовать прецедент для применения знаний? – jbl

+0

В этом конкретном примере он просит использовать явный курсор. – jbl