Как использовать переменную привязки в теле триггера?

#plsql #oracle11g #database-trigger

#plsql #oracle11g #база данных-триггер

Вопрос:

Я новичок в PL / SQL. Я использую oracle 11g XE вместе с sql developer. Я пытаюсь создать, чтобы создать триггер после вставки следующим образом

 create or replace trigger tr1
after 
insert ON
employee
for each row
begin
 print :new.emp_id;
end;
  

Таблица employee выглядит следующим образом

 create table employee
( emp_id varchar2(5) primary key,
  emp_name varchar2(10),
  salary number,
  company varchar2(10) foreign key references companies(comp_name)
);
  

Когда я запускаю инструкцию, я получаю окно ввода привязок для переменной привязки: new. Но я был смущен тем, зачем мне нужно вводить значение для :new, поскольку это псевдозапись. Затем я ввел ’employee’ в качестве значений для :new . Теперь я получаю следующую ошибку.

 Error(2,8): PLS-00103: Encountered the symbol "" when expecting one of the following:     := . ( @ % ; The symbol ":=" was substituted for "" to continue.   
  

Комментарии:

1. При компиляции SQL developer попросит вас ввести переменную привязки. Просто оставьте их пустыми. Они не являются источником ошибки здесь. Когда триггер запускается при вставке, значение :new.emp_id будет вставлено в таблицу. Она будет заполнена автоматически. Скомпилируйте триггер, затем попробуйте вставить для тестирования.

2. @Hawk. Спасибо за ответ. Я его скомпилировал. Но у него ошибка, которую я указал в вопросе.

3. Если проблема в том, что разработчик SQL выдает подсказки, пожалуйста, отметьте свой вопрос. sqldeveloper Я сам с этим не знаком.

Ответ №1:

Ваша проблема не в :new псевдозаписи. Ошибка возникает из-за использования print , которое используется для печати переменной привязки, используемой в успешном блоке PL / SQL или используемой в команде ВЫПОЛНЕНИЯ. Например, вы можете использовать это так:

 VARIABLE n NUMBER   
BEGIN  
:n := 1;  
END;  
/      
  

Затем

 PRINT n;
  

Но если вы хотите проверить вставляемое значение, вы можете использовать DBMS_OUTPUT .PUT_LINE вот так:

 create or replace trigger tr1   
after    
insert ON   
employee   
for each row   
BEGIN   
 dbms_output.put_line(:new.emp_id);   
END;   
/   
  

Включите окно DBMS_OUTPUT в вашем SQL Developer, затем запустите

 insert into employee values(1, 'empName', 1000, 'ABC');
  

Вы увидите 1 распечатанный файл.

Однако вы всегда можете проверить значение из таблицы. Потому что значение должно быть уже вставлено в таблицу. Вы можете просто запросить.