0 0

关于oracle触发器操作的疑问5

 首先说明我要实现的功能:假设A表和B表,我想实现,在增加A表的同时,利用刚刚插入的数据和A表中已有的数据(包括刚刚插入的数据)进行如数据编码(code)组合,生成一个新的字符串插入到B表中的编码列;

我使用的Oracle客户端是PL/SQL devloper 8,

我现在想到的方案:

方案1:使用行触发器,在插入的时候使用new获取刚刚插入的数据,这样跟之前已经有的数据组合,但是这样当插入两条或多条的时候,会出现下一条总是无法和刚刚插入的数据组合,也就是不能发现同一批插入的数据;(按道理,两个SQL语句应该是两个事务,应该能使用刚刚插入的数据,这是第一个疑问,是不是客户端造成的,我的客户端设置是自动提交SQL,不应该有问题)

方案2:在第一种方案不能满足需求,我寻求了第二种方案,就是建立一个全局临时表,然后使用行触发器把新插入的数据放到临时表中,再最后做一次语句触发器,在语句级触发器中使用游标遍历临时表记录,跟已经存在的数据进行组合,插入到B表中;(疑问2:在插入多条数据的时候,比如两个insert语句,行触发器在临时表新增一条数据,然后触发了一次语句级触发器,然后行触发器在临时表又新增一条数据,然后又触发了一次语句级触发器,跟我预想的应该是两次行触发器,一次最终语句级触发不一样,不知道是不是我理解的不对;按照我的理解,两个insert语句应该是两个事务,这样临时表只会保留一条记录,但是目前确实是多条;如果两条insert在一个事务内,为什么又多次触发语句级触发器?);目前解决方法就是在语句触发器最后增加一条删除临时表数据,这样保证临时表始终是最新插入的数据。代码如下:

 

	CREATE   TABLE A
  (
       id     number,
        name     varchar2(30),
	birthdate    date
      ) ;

 

-- B表    
CREATE   TABLE B
  (
       id     number,
        name     varchar2(30),
	birthdate    date
      ) ;

 

-- 创建临时表 a_tt,存储刚刚插入的数据
	CREATE global temporary TABLE a_tt
  (id     number,
          name     varchar2(30),
	birthdate    date
      ) ON COMMIT DELETE ROWS;
 --A表的行触发器记录新插入的数据
create or replace trigger a_insert_row
      AFTER insert   on  A  for each row
	     declare
 begin 
	           insert into  a_tt(id,name,birthdate) values(:new.id,:new.name,:new.birthdate);
   end;   

 

   create or replace trigger aaaa_insert_tt  AFTER insert   on  A
              declare  
		v_name  aaaa_log.name%type;  
		cursor n_cur is select name  from a_tt;
	    	begin          
		   dbms_output.put_line('语句触发器执行');
	            for cur in  n_cur loop  
			dbms_output.put_line( cur.name);											        	
		insert into B(name)  select cur.name ||'_' ||name  from A;	
		end loop;
                    --	 delete from a_tt; --删除临时表过时数据 		 
        end;

 测试语句:

 insert  into A  values(2,'a',sysdate);         

insert  into A values(3,'b',sysdate);

 

预期结果:B表中name 列 2_2,3_2,3_3

 

希望各位大神,帮我理理思路,不知道我说清没有

触发器执行的时候是不是在行触发器(after)之后提交数据,在语句级触发器就可以使用提交后的数据

 

2013年6月17日 10:47

1个答案 按时间排序 按投票排序

0 0

采纳的答案

好像这样就能实现了吧,不用中间表吧

create or replace trigger a_for_test
  before insert on a
  for each row declare  

cursor cur is
    select id as nm from a t;
begin

  FOR i in cur LOOP
    insert into b
      (name, birthdate)
    values
      (i.nm || '_' || :new.id, sysdate);
  END LOOP;

  insert into b
    (name, birthdate)
  values
    (:new.id || '_' || :new.id, sysdate);
end a_for_test;

2013年6月17日 14:05

相关推荐

    toad for oracle 说明介绍

    2. 数据库浏览器:允许用户以树状结构或表格形式浏览数据库对象,并可对对象执行诸如查看结构、数据编辑、触发器、存储过程等操作。 3. 数据库工具:提供多种数据库管理工具,如对象比较、数据比较、数据库比较、...

    Oracle数据库日常维护方案书

    - 电子邮件支持:通过电子邮件解答客户的疑问。 - 紧急故障处理:针对紧急故障,提供快速响应机制。 - 定期巡检服务:每年至少安排24次定期巡检,确保系统的稳定运行。 #### 五、培训方案 - **培训方式** - ...

    ORACLE初学者入门心得(经典版)

    - **核心技能**:编写存储过程、触发器等SQL脚本,以及使用Oracle提供的工具如Oracle Developer来构建表单(Form)等应用程序界面。 - **所需特质**:良好的逻辑思维能力、创造力以及对编程的热爱。 - **未来展望...

    oracle开发过程收集_rar

    它是Oracle特有的编程语言,结合了SQL与过程编程,用于编写存储过程、函数、触发器等数据库对象,实现更复杂的数据处理逻辑和业务规则。 在实际开发中,可能会遇到的问题包括性能优化、事务管理、并发控制、备份与...

    oracle入门必看

    开发工作主要包括编写存储过程、触发器等,以及使用Oracle Developer工具构建表单,需要较强的逻辑思维和创新能力。而管理工作则涉及数据库的日常运维,需要深入理解Oracle的工作原理,具备处理复杂问题的能力,经验...

    oracle 初学1000问

    ### Oracle初学者常见问题解析 ...以上总结了Oracle初学者在日常操作和维护中常见的疑问及解决方法,涵盖了数据库创建、登录、权限管理、性能监控等多个方面,对于新手来说是非常实用的参考资料。

    ORACLE应用常见傻瓜问题1000问

    《ORACLE应用常见傻瓜问题1000问》这一资料专为初学者设计,旨在解答在使用Oracle数据库过程中遇到的各类基础性疑问。以下,我们将深入探讨文档中列出的部分核心知识点,帮助读者更好地理解Oracle的基本操作与管理。...

    PLSQL集成ORACLE客户端精简版

    10. **社区支持**:如果你在使用过程中遇到问题,可以寻找在线社区的帮助,比如Oracle官方论坛、Stack Overflow等,那里有许多经验丰富的用户和专家可以解答你的疑问。 总之,"PLSQL集成ORACLE客户端精简版"是一个...

    oracle实用文档

    3. 重做日志文件:记录所有数据库事务的更改,用于故障恢复和归档操作。 4. 参数文件:定义Oracle实例的配置参数,包括内存结构大小等设置。 5. 归档文件:重做日志的备份,用于长期保留更改历史。 6. 密码文件:...

    Oracle常用傻瓜问题1000问

    1. **安装与配置**:Oracle的安装过程可能涉及操作系统兼容性、硬件需求、网络设置、SID与服务名的配置,以及环境变量的设定等。 2. **数据库创建与管理**:如何创建数据库实例,理解DBCA(Database Configuration ...

    Oracle数字类型number自增的实现代码

    3. **Oracle触发器(Trigger)**: - 触发器是一种数据库对象,它在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行。在示例中,创建了一个名为`trigger_student`的触发器,它在`student`表上的`...

    oracle中添加删除主键的方法

    关于并发控制,Oracle数据库使用行级锁来保证多用户环境下对主键的修改不会冲突。当多个用户同时尝试更新主键列时,可能会发生行级锁,需要等待其他事务释放锁才能继续执行。 最后,虽然Oracle和MySQL、SQL Server...

    掌握数据库核心技能:课程设计实战指南,深入解析MySQL、Oracle关键技术,助力学生轻松应对课程设计挑战

    - **选择合适的DBMS**:根据项目需求选择MySQL、Oracle等。 - **设计索引策略**:合理使用索引可以显著提高查询效率。 - **性能优化**:采用分表、分区等技术提高系统响应速度。 #### 五、数据库实现 此阶段涉及...

    pl-sql-dev-8-setup主程序的安装文档

    它支持多种 Oracle 功能,如触发器、存储过程、函数等,并提供了一系列高级功能,包括代码编辑、调试、编译、性能分析等。通过使用 PL/SQL Developer 8,开发者可以更轻松地管理和维护复杂的数据库应用。 #### 三、...

    基于jsp的图书馆管理系统

    Oracle提供的PL/SQL扩展语言也可以用来编写存储过程和触发器,进一步增强数据库的功能。 图书管理系统的具体功能可能包括: 1. 用户管理:用户注册、登录,修改个人信息。 2. 图书浏览:按类别、关键词搜索图书,...

    mysql参考手册

    文档中也提到了在不同MySQL版本中可能不包含的特性,如果用户对此有疑问,应该参考他们的MySQL 5.6许可协议或联系Oracle的销售代表。 在介绍部分,文档提供了关于MySQL信息来源的信息,包括MySQL的网站、邮件列表、...

    MYSQL 5.7 reference Manual

    如果你对你的MySQL 5.7版本包含哪些特性有疑问,应参考你的MySQL 5.7许可协议或联系Oracle的销售代表。 在每个发行版中的更改详情,可以在MySQL 5.7发行说明中找到。法律信息,包括许可信息,可在前言和法律通知中...

    plsql-dev8(带汉化包).rar

    3. **数据库对象管理**:你可以创建、修改和删除表、视图、索引、存储过程、函数、触发器等数据库对象。 4. **数据操作**:直接在IDE中运行SQL查询,查看结果,甚至可以进行数据导入导出操作。 5. **版本控制集成**...

    Mysql 5.7最新参考手册

    如果您对MySQL 5.7的特定功能有疑问,您应当参考您的MySQL 5.7许可协议或联系您的Oracle销售代表,因为某些特性可能并未包含在您的MySQL 5.7授权版本中。 在新版本中,手册描述了一些新的特性和功能,包括但不限于...

    refman8refman8refman8refman8refman8refman8

    如果您对您的版本包含哪些特性有疑问,应参阅您的MySQL 8.0许可协议或咨询Oracle的销售代表。 每个发行版的变更详情可以在《MySQL 8.0 发行说明》中找到。对于法律信息,包括许可信息,请参阅前言和法律通知。在...

Global site tag (gtag.js) - Google Analytics