создать триггер, который будет копировать немного данных из другой таблицы после фильтрации по условию - PullRequest
2 голосов
/ 11 марта 2012

у меня 5 таблиц. они ---

create table customer
(
cust_name varchar2(20),
cust_id number(5),
date_of_birth date
)

insert into customer values('Mark',1,'10-JAN-1984');
insert into customer values('Sam',2,'22-FEB-1990');

create table bank
(
bank_name varchar2(20),
bank_id number(5)
)

insert into bank values(20,'HDFC');
insert into bank values(42,'ICICI');

create table location
(
bank_id  number(5),
loc_name  varchar2(20)
)
insert into location values(30,'Delhi');
insert into location values(30,'USA');

create table loan
(
cust_id number(5),
bank_id number(5),
st_date date
intrest number(5)
)



create table audit
(
cust_id number(5),
cust_name varchar2(20),
date_of_birth date,
bank_name varchar2(20),
st_date date,
loc_name  varchar2(20),
interest number(5)
)

Я хочу создать триггер на таблице ссуд, если какой-либо клиент получает 0 процентов, то данные этого клиента и его банка должны храниться в таблице аудита.

так что если выполнить этот код -

insert into loan values(1,20,'20-DEC-2011',0);

Это означает, что этот клиент получает 0 процентов, поэтому его записи и банковские записи должны храниться в таблице аудита.

Мой код триггера -

create  or replace  trigger trg_loan
after insert or update
on loan
for each row
declare
var_loc varchar2(50); 
var_name varchar2(50);
var_bankname varchar2(50);

begin

select cust_name into var_name from customer where cust_id = :new.cust_id;
select bank_name into var_bankname from bank where bank_id = :new.bank_id;
select loc_name into var_loc from location where loc_id = :new.loc_id;

    IF (:new.interest = 0) THEN
insert into audit
values(:new.cust_id,var_name,:new.date_of_birth,var_bankname,:new.st_date,var_loc,:new.interest);

    END IF; 
end;

поэтому этот триггер создан с ошибкой компиляции. И это также не отвечает моим интересам.

1 Ответ

2 голосов
/ 12 марта 2012
  • Сначала поймите эту логику, что, если вы ссылаетесь на :new.[variable_name] внутри триггера, то его всегда следует ссылаться на те столбцы таблицы, к которым был применен триггер. Например, в вашем случае триггер применяется к таблице loan, поэтому с ключевым словом :new используется только cust_id number(5), bank_id number(5), st_date date intrest number(5).

  • Во-вторых, при создании триггера обнаружены следующие ошибки.

    Ошибки компиляции для TRIGGER SCOTT.TRG_LOAN

    Ошибка: PLS-00049 : переменная неверного связывания 'NEW.INTEREST' Линия: 12 Текст: ЕСЛИ (: новый.интерес = 0), ТО

    Причина : вы использовали скрипт для создания таблицы с именем столбца intrest not interest, пожалуйста, измените имя таблицы на интересующее.

    Ошибка: PLS-00049 : переменная неверного связывания 'NEW.LOC_ID' Линия: 15 Текст: выберите loc_name в var_loc из местоположения, где loc_id =: new.loc_id;

    Причина : вы не можете ссылаться на :new.loc_id в этом триггере, поскольку он не является частью столбца таблицы loc.

    Ошибка : PLS-00049: переменная неверного связывания 'NEW.DATE_OF_BIRTH' Линия: 17 Текст: значения (: new.cust_id, var_name,: new.date_of_birth, var_bankname,: new.st_date, var_loc,: new.interest);

    Причина : И снова date_of_birth не является столбцом таблицы loc, в вашем случае извлекайте данные из таблицы клиентов, например

    select cust_name,date_of_birth into var_name,var_dob from customer where cust_id = :new.cust_id; и затем используйте эту переменную var_dob при вставке в audit таблицу

    Ошибка: PLS-00049: неверная переменная привязки 'NEW.INTEREST' Линия: 17 Текст: значения (: new.cust_id, var_name,: new.date_of_birth, var_bankname,: new.st_date, var_loc,: new.interest);

    Причина : То же, что и выше.

Предложение : Если вы хотите вставить данные в таблицу аудита только в случае 0 значения интереса, поместите все операторы выбора внутри предложения if, так как нет необходимости извлекать эти значения, если процентное значение не равно нулю.

создание триггера документация триггера оракула

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...