注册 登录
编程论坛 Oracle论坛

一个关于触发器的问题

liugy52 发布于 2006-12-04 16:23, 1453 次点击

从数据库触发器调用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>

7 回复
#2
angeloc2006-12-04 16:30
UPDATE后你是否有COMMIT?
#3
liugy522006-12-04 16:34

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

#4
angeloc2006-12-04 16:40

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

#5
liugy522006-12-04 16:50

谢谢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兄的提示,使我发现了问题的原因所在.

#6
liugy522006-12-04 16:52

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

#7
liugy522006-12-04 16:52
现在改为1000左右的,终于执行成功了。
#8
angeloc2006-12-04 17:40
以下是引用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兄的提示,使我发现了问题的原因所在.

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

1