一个关于触发器的问题
<P>从数据库触发器调用Java存储过程</P><P>假设用下面的Java类创建表sal_audit记录雇员薪水的增加值超出20%的情况</P>
<P>/*<BR> * @(#) DBTrigger.java<BR> */</P>
<P>import java.sql.*;<BR>import java.io.*;</P>
<P>import oracle.jdbc.*;</P>
<P><BR>public class DBTrigger {</P>
<P> public static void logSal(int empID, float oldSal, float newSal)<BR> throws SQLException {<BR> Connection conn = DriverManager.getConnection(<BR> "jdbc:default:connection:");<BR> String sql = "INSERT INTO sal_audit VALUES (?, ?, ?)";</P>
<P> try {<BR> PreparedStatement pstmt = conn.prepareStatement(sql);<BR> pstmt.setInt(1, empID);<BR> pstmt.setFloat(2, oldSal);<BR> pstmt.setFloat(3, newSal);<BR> pstmt.executeUpdate();<BR> pstmt.close();<BR> }<BR> catch (SQLException e) {<BR> System.err.println(e.getMessage());<BR> }<BR> }<BR>}</P>
<P><BR>以下操作在命令提示符中进行:</P>
<P>N:\$$$>loadjava -user scott/tiger DBTrigger.class</P>
<P>N:\$$$>sqlplus /nolog</P>
<P>SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 12月 4 16:14:38 2006</P>
<P>Copyright (c) 1982, 2005, Oracle. All rights reserved.</P>
<P>SQL> connect scott/tiger<BR>已连接。<BR>SQL> create or replace procedure log_sal(<BR> 2 emp_id number,<BR> 3 old_sal number,<BR> 4 new_sal number<BR> 5 )<BR> 6 as language java<BR> 7 name 'DBTrigger.logSal(int, float, float)';<BR> 8 /</P>
<P>过程已创建。</P>
<P>SQL> create table sal_audit(<BR> 2 empno number,<BR> 3 oldsal number,<BR> 4 newsal number<BR> 5 );</P>
<P>表已创建。</P>
<P>SQL> create or replace trigger sal_trig<BR> 2 after update of sal on emp<BR> 3 for each row<BR> 4 when (new.sal > 1.2 * old.sal)<BR> 5 call log_sal(:new.empno, :old.sal, :new.sal)<BR> 6 /</P>
<P>触发器已创建</P>
<P><STRONG>SQL> update emp set sal = sal + 300;</STRONG></P>
<P><STRONG>已更新13行。 /******** 这里已经说更新了13行,因此表sal_audit中应该已经插入了13个新的记录。 *******/</STRONG></P>
<P><STRONG>SQL> select * from sal_audit;</STRONG></P>
<P><STRONG>未选定行 /******** 但是这里说明表sal_audit中实际上没有新的记录,这是怎么回事???? ******/</STRONG></P>
<P>SQL></P> UPDATE后你是否有COMMIT? <P>我没有用COMMIT,所有的过程都写在上面了。</P> <P>UPDATE后不COMMIT是不会更新表的吧?</P> <P>谢谢angeloc兄的提示,我记得起初表EMP中SAL列的值有几个都比较小,有几个在执行<BR>update emp set sal = sal + 300;<BR>后都满足条件 <BR>new.sal > 1.2 * old.sal<BR><BR>这些语句不是作为一个事务进行执行的,<BR>由于以前SQL脚本中有错误,但是语句<BR>update emp set sal = sal + 300;<BR>还是正确执行了<BR><BR>所以刚才检查SAL列值时,每个记录都不满足了,所以表sal_audit中没有插入新值。<BR><BR>真诚的感谢angeloc兄的提示,使我发现了问题的原因所在.<BR></P> <P>刚才看的时候,SAL列的值几乎都到6000左右了,前面很多次执行都不成功。</P> 现在改为1000左右的,终于执行成功了。 <DIV class=quote><B>以下是引用<U>liugy52</U>在2006-12-4 16:50:12的发言:</B><BR>
<P>谢谢angeloc兄的提示,我记得起初表EMP中SAL列的值有几个都比较小,有几个在执行<BR>update emp set sal = sal + 300;<BR>后都满足条件 <BR>new.sal > 1.2 * old.sal<BR><BR>这些语句不是作为一个事务进行执行的,<BR>由于以前SQL脚本中有错误,但是语句<BR>update emp set sal = sal + 300;<BR>还是正确执行了<BR><BR>所以刚才检查SAL列值时,每个记录都不满足了,所以表sal_audit中没有插入新值。<BR><BR>真诚的感谢angeloc兄的提示,使我发现了问题的原因所在.<BR></P></DIV>
<P>哪里,我都没帮上什么忙[em04],互相学习[em01]</P>
页:
[1]
