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