标题:一个关于触发器的问题
只看楼主
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
 问题点数:0 回复次数:7 
一个关于触发器的问题

从数据库触发器调用Java存储过程

假设用下面的Java类创建表sal_audit记录雇员薪水的增加值超出20%的情况

/*
* @(#) DBTrigger.java
*/

import java.sql.*;
import java.io.*;

import oracle.jdbc.*;


public class DBTrigger {

public static void logSal(int empID, float oldSal, float newSal)
throws SQLException {
Connection conn = DriverManager.getConnection(
"jdbc:default:connection:");
String sql = "INSERT INTO sal_audit VALUES (?, ?, ?)";

try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, empID);
pstmt.setFloat(2, oldSal);
pstmt.setFloat(3, newSal);
pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException e) {
System.err.println(e.getMessage());
}
}
}


以下操作在命令提示符中进行:

N:\$$$>loadjava -user scott/tiger DBTrigger.class

N:\$$$>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 12月 4 16:14:38 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> connect scott/tiger
已连接。
SQL> create or replace procedure log_sal(
2 emp_id number,
3 old_sal number,
4 new_sal number
5 )
6 as language java
7 name 'DBTrigger.logSal(int, float, float)';
8 /

过程已创建。

SQL> create table sal_audit(
2 empno number,
3 oldsal number,
4 newsal number
5 );

表已创建。

SQL> create or replace trigger sal_trig
2 after update of sal on emp
3 for each row
4 when (new.sal > 1.2 * old.sal)
5 call log_sal(:new.empno, :old.sal, :new.sal)
6 /

触发器已创建

SQL> update emp set sal = sal + 300;

已更新13行。 /******** 这里已经说更新了13行,因此表sal_audit中应该已经插入了13个新的记录。 *******/

SQL> select * from sal_audit;

未选定行 /******** 但是这里说明表sal_audit中实际上没有新的记录,这是怎么回事???? ******/

SQL>

搜索更多相关主题的帖子: 触发器 薪水 数据库 import java 
2006-12-04 16:23
angeloc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:36
帖 子:1353
专家分:0
注 册:2006-11-21
得分:0 
UPDATE后你是否有COMMIT?

老牛明知夕阳晚,不用扬鞭自奋蹄; Angelo\'s BLOG
2006-12-04 16:30
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
得分:0 

我没有用COMMIT,所有的过程都写在上面了。


我在大家热情的帮助下进步,谢谢你们!
2006-12-04 16:34
angeloc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:36
帖 子:1353
专家分:0
注 册:2006-11-21
得分:0 

UPDATE后不COMMIT是不会更新表的吧?


老牛明知夕阳晚,不用扬鞭自奋蹄; Angelo\'s BLOG
2006-12-04 16:40
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
得分:0 

谢谢angeloc兄的提示,我记得起初表EMP中SAL列的值有几个都比较小,有几个在执行
update emp set sal = sal + 300;
后都满足条件
new.sal > 1.2 * old.sal

这些语句不是作为一个事务进行执行的,
由于以前SQL脚本中有错误,但是语句
update emp set sal = sal + 300;
还是正确执行了

所以刚才检查SAL列值时,每个记录都不满足了,所以表sal_audit中没有插入新值。

真诚的感谢angeloc兄的提示,使我发现了问题的原因所在.


我在大家热情的帮助下进步,谢谢你们!
2006-12-04 16:50
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
得分:0 

刚才看的时候,SAL列的值几乎都到6000左右了,前面很多次执行都不成功。


我在大家热情的帮助下进步,谢谢你们!
2006-12-04 16:52
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
得分:0 
现在改为1000左右的,终于执行成功了。

我在大家热情的帮助下进步,谢谢你们!
2006-12-04 16:52
angeloc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:36
帖 子:1353
专家分:0
注 册:2006-11-21
得分:0 
以下是引用liugy52在2006-12-4 16:50:12的发言:

谢谢angeloc兄的提示,我记得起初表EMP中SAL列的值有几个都比较小,有几个在执行
update emp set sal = sal + 300;
后都满足条件
new.sal > 1.2 * old.sal

这些语句不是作为一个事务进行执行的,
由于以前SQL脚本中有错误,但是语句
update emp set sal = sal + 300;
还是正确执行了

所以刚才检查SAL列值时,每个记录都不满足了,所以表sal_audit中没有插入新值。

真诚的感谢angeloc兄的提示,使我发现了问题的原因所在.

哪里,我都没帮上什么忙,互相学习


老牛明知夕阳晚,不用扬鞭自奋蹄; Angelo\'s BLOG
2006-12-04 17:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-107214-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.617931 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved