请问这个行级触发器怎么写

puppylsy 2003-09-22 02:47:08
表1:Address 表2:Class 表3: (Address和Class的映射表)
AddressID(key) ClassID(key) AddressID
AddressName ClassName ClassID

表4:
AddressID(key)
AddressName
ClassName1
ClassName2

现在往表4中插入表1的数据,还希望插入ClassName1和ClassName2两个字段,这两个字段是表4的AddressID从表3映射表中查出来对应,前两个ClassID对应到表2的ClassName字段(如果没有两个就设为空),请问应该怎么写触发器,多谢!
...全文
26 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
puppylsy 2003-10-17
  • 打赏
  • 举报
回复
多谢各位大虾指点,再次向各位提供帮助的朋友和帮我顶的朋友致谢!
vrv0129 2003-09-25
  • 打赏
  • 举报
回复
up
DavidGu 2003-09-25
  • 打赏
  • 举报
回复
注意,你无法在一个表里插入记录时,再通过后台的TRIGGER来触发修改这个表的字段。因此,你只能在插入记录时,在前台同时完成相关字段的赋值。你可以在pre insert 事件完成下面的代码。
good luck!

DECLARE
n_temp number;
class_name1 YourType;
class_name2 YourType;
CURSOR class_name IS
SELECT a.ClassName FROM 表2 a,表3 b
WHERE a.ClassId=b.ClassId and b.AddressId=:new.AddressId;
begin
if inserting then
n_temp:=1
for RC in class_name loop
if n_temp=3 then
exit;
end if;
if n_temp=1 then
class_name1:=RC.ClassName;
end if;
if n_temp=2 then
class_name2:=RC.ClassName;
end if;

n_temp:=n_temp+1;
end loop;
ClassName1:=class_name1;
ClassName2:=class_name2;
end if;
end;
anne 2003-09-24
  • 打赏
  • 举报
回复
少FORM关键字。
anne 2003-09-24
  • 打赏
  • 举报
回复
楼上的哥们写错了。
anne 2003-09-24
  • 打赏
  • 举报
回复
请问楼主,建表3的时候根据什么条件?也就是AddressID和ClassID如何对应?
beckhambobo 2003-09-22
  • 打赏
  • 举报
回复
create or replace trigger sy
before insert on 表4
for each row
begin
select ClassName into
select (select ClassName from 表2 b where b.ClassID=C.ClassID) INTO :new.ClassName1 from 表3 c where AddressID=:new.AddressID;
end;
/
qiuyang_wang 2003-09-22
  • 打赏
  • 举报
回复
create or replace trigger sy befor insert on 表4 for each row
begin
select classNeme into :new.className1 from 表2
where classid =
(select classid from 表3
where addressid = :new.addressid and rownum <= 1);

select classNeme into :new.className2 from 表2
where classid =
(select classid from 表3
where addressid = :new.addressid and rownum <= 1
and classid <> :new.className1);

EXCEPTION
WHEN OTHERS THEN
null;
end;
实验五 触发器实验报告 [实验目的] 1. 理解Oracle触发器的种类和用途 2. 掌握行级触发器的编 [预备知识] 1. PL/SQL程序设计 [实验原理] 1. 建立触发器 CREATE [OR REPLACE] TRIGGER <触发器名> BEFORE"AFTER INSERT"DELETE"UPDATE OF <列名> ON <表名> [FOR EACH ROW] WHEN (<条件>) ON 子句中的名称识别与数据库触发器关联的数据库表 触发器事件指定了影响表的 SQL DML 语句 ( INSERT、 DELETE 或 UPDATE) AFTER 指定了触发器在处理完成后触发 BEFORE 指定了触发器在处理完成前触发 默认情况下,触发器每个表触发一次 FOR EACH ROW 选项指定触发器每行触发一次(即触发器行级触发器) 要使触发器触发,WHEN 子句中布尔型表达式的值必须判定为 TRUE 可以将 REPLACE 添加到 CREATE 语句以自动删除和重建触发器 2. 行级触发器中引用表数据 在行级触发器中,使用伪记录来表示旧数据:old和新数据:new 引用示例::new.customer_name, :old.customer_name 3. 行级触发器中的谓词 在一个多条件触发的触发器中,使用谓词可以区分当前触发的操作的类型:inserting, updating,deleting。 示例: IF Inserting THEN 语句 ; END IF; IF Updating THEN 语句 ; END IF; IF Deleting THEN 语句 ; END IF; 4. 触发器的限制 SELECT 语句必须是 SELECT INTO 语句或内部游标声明。 行级触发器不可以对触发表进行查询,包括其调用的子过程中。 不允许 DDL 声明和事务控制语句 。 如果由触发器调用存储子过程,则存储子程序不能包括事务控制语句 。 :old 和 :new 值的类型不能是 LONG 和 LONG RAW。 [实验内容] 1. 给Customer表增加一列Savings,类型为int,来存放每个顾客的存款总额。 ALTER TABLE customer ADD (saving varchar2(30)); select * from customer; 2. 更新Customer表,使得Savings字段的值正确。 3. 在Account表上增加一个行级触发器,当对account的balance进行update和insert一个 记录时同步修改Customer的Savings字段,保证数据的一致性。 4. 对account进行update操作,记录account表和customer表的变化。 5. 去掉顾客- 存款账号表中引用account表的外键约束(如果不去掉,后面的操作无法实现。当然最 佳的方法是修改其外键约束的更新策略,但考虑到复杂性,这里使用不标准的做法, 但建议大家实际运用中不要这么做)。在顾客- 存款账号表插入一条记录,表明顾客开设了一个新的账户。 6. 将一条刚才新开账户号的存款记录插入账号表,记录account表和customer表的变化。 [实验总结] 1. 实验中遇到的问题和解决的方法。 ----------------------- "触发事件 ":old ":new " "Insert "无定义,所有字段都是N"该语句完成后插入的值 " " "ULL " " "Update "更新前该行的旧值 "更新后该行的值 " "Delete "删除前该行的值 "无定义,所有字段都是N" " " "ULL "

17,137

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧