sql - 创建一个触发器,在从条件过滤后从其他表复制少量数据

标签 sql oracle

我有 5 张 table 。他们是——

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;

所以这个触发器是在编译错误的情况下创建的。它也不符合我的兴趣。

最佳答案

  • 首先要理解这个逻辑,如果你指的是:new.[variable_name]在触发器内部,则应始终引用应用了触发器的表的那些列。 例如:在您的情况下,触发器应用于 loan表,所以只有cust_id number(5), bank_id number(5), st_date date intrest number(5):new 一起使用关键字。

  • 创建触发器时发现以下错误。

    TRIGGER SCOTT.TRG_LOAN 编译错误

    错误:PLS-00049:错误的绑定(bind)变量“NEW.INTEREST” 线路:12 文本:IF (:new.interest = 0) THEN

    原因:您使用了创建列名为 intrest not interest 的表的脚本,请将表名更改为感兴趣的。

    错误:PLS-00049:错误的绑定(bind)变量“NEW.LOC_ID” 线路:15 文本:从 loc_id = :new.loc_id; 的位置选择 loc_name into var_loc;

    原因:您无法引用:new.loc_id在此触发器中,因为这不是 loc 的一部分表格列。

    错误:PLS-00049:错误的绑定(bind)变量“NEW.DATE_OF_BIRTH” 线路:17 文本:values(: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:错误的绑定(bind)变量“NEW.INTEREST” 线路:17 文本:values(:new.cust_id,var_name,:new.date_of_birth,var_bankname,:new.st_date,var_loc,:new.interest);

    原因:同上。

建议:如果您只想在 0 的情况下将数据插入审计表中兴趣值,然后将所有 select 语句放在 if 子句中,因为如果兴趣值不为零,则无需获取这些值。

正在创建触发器trigger oracle documentation

关于sql - 创建一个触发器,在从条件过滤后从其他表复制少量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9656059/

相关文章:

sql - 是否可以将此 Sql 语句重构为不使用 RANK/PARTITION?

oracle - Oracle 中物理表的最大大小是多少?

oracle - 从 plsql 代码重定向到新选项卡中的 url

java - 如何创建 oracle.sql.ARRAY 对象?

sql - oracle sql TO_CHAR 函数在某些情况下添加尾随空白

mysql - 从2个表中获取差异值

sql - 是否可以重命名数据库中已有的 MySQL 表名?

spring - 使用 Spring Boots application.properties 优化 JDBC 获取大小

java - ORA-12518,TNS :listener could not hand off client connection comes from a loop with heavy memory access

java - 如何在没有entryId的情况下更新SQLiteOpenHelper中的条目?