上善若水
愿倾其毕生之功,高扬.NET旗帜

在项目实际开发过程中,最近几次用到oracle中的函数Function、触发器和行列转换,发现有时候直接在数据库层次操作来得更方便

1.Function

说实在的,现在我还不知道怎么去写这个,只是从网上摘选了一段用上了。

由于项目开发过程中,需要直接在SQL把字符串按照分隔符变换为多条记录,具体代码如下:

Code

 

2.触发器

项目开发过程中,需要对业务对象的操作进行记录,这时候如果在应用层去做,可能有点麻烦,但是利用数据库的触发器就很好解决了问题

Code

 

Code

 

Code

这里需要注意的是,对于删除触发器,我们是无法获取删除的文件名的,这里触发器是为了防止脏读。

这是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.行列转换

项目中有两种数据需要比较,不过一种是列形式,一种是行形式;

这样把其中一种直接转换,变成同样的形式,这样就方便比较了

Code


不过这里需要对比的列长达2000多列,估计数据库对组成的sql分析就占用很长时间,所以在项目实际应用中还是没有采用这样的办法,但是估计在少量的转换还是划算的

项目实际采用下面的方式

 

Code
posted on 2008-10-20 10:19  小兔快跑  阅读(247)  评论(0编辑  收藏  举报