在项目实际开发过程中,最近几次用到oracle中的函数Function、触发器和行列转换,发现有时候直接在数据库层次操作来得更方便
1.Function
说实在的,现在我还不知道怎么去写这个,只是从网上摘选了一段用上了。
由于项目开发过程中,需要直接在SQL把字符串按照分隔符变换为多条记录,具体代码如下:
2.触发器
项目开发过程中,需要对业务对象的操作进行记录,这时候如果在应用层去做,可能有点麻烦,但是利用数据库的触发器就很好解决了问题
这里需要注意的是,对于删除触发器,我们是无法获取删除的文件名的,这里触发器是为了防止脏读。
这是oracle的规定,不能对执行触发器的表进行操作。
可以对new.xxx进行操作啊,
对于oracle行级触发器(for each row),不能对本表做任何操作,包括读取
原则:
在before insert触发器中,可以实现对本表的访问;
在after insert触发器中,不能实现对本表的访问;
在before/after update/delete触发器中,都不能实现对本表的访问
这里所说的访问是指不能通过sql语句去访问本表,但是我们可以通过:old和:new来访问表的字段。
另外再介绍一点
写oracle行级触发器时,不能操作本表,报"表 *** 发生了变化,触发器/函数不能读"的错误的解决办法
原因已经很明显了就是行级的触发器代码中不能操作该表,包括select,是挺郁闷的
当然解决方法就是要根据原因了,正因为限定了行级触发器的操作,只能选择表级的触发器了,但是在表级的触发器又不能获得:new和:old的值,那就只能采取两种触发器并用的方法了,并且还要包或者临时表加以辅助.
首先在行级触发器中将所需的,:new或者:old的值,写到包或者临时表中
然后在表级触发器中处理包或者临时表中已经写入的数据,操作成功后可以按照需求再删除临时表的数据.
3.行列转换
项目中有两种数据需要比较,不过一种是列形式,一种是行形式;
这样把其中一种直接转换,变成同样的形式,这样就方便比较了
}
不过这里需要对比的列长达2000多列,估计数据库对组成的sql分析就占用很长时间,所以在项目实际应用中还是没有采用这样的办法,但是估计在少量的转换还是划算的
项目实际采用下面的方式
}