编程论坛's Archiver

liugy52 发表于 2006-12-4 16:23

一个关于触发器的问题

<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:\$$$&gt;loadjava -user scott/tiger DBTrigger.class</P>
<P>N:\$$$&gt;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&gt; connect scott/tiger<BR>已连接。<BR>SQL&gt; 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&gt; create table sal_audit(<BR>  2      empno number,<BR>  3      oldsal number,<BR>  4      newsal number<BR>  5  );</P>
<P>表已创建。</P>
<P>SQL&gt; create or replace trigger sal_trig<BR>  2  after update of sal on emp<BR>  3  for each row<BR>  4  when (new.sal &gt; 1.2 * old.sal)<BR>  5  call log_sal(:new.empno, :old.sal, :new.sal)<BR>  6  /</P>
<P>触发器已创建</P>
<P><STRONG>SQL&gt; update emp set sal = sal + 300;</STRONG></P>
<P><STRONG>已更新13行。    /******** 这里已经说更新了13行,因此表sal_audit中应该已经插入了13个新的记录。 *******/</STRONG></P>
<P><STRONG>SQL&gt; select * from sal_audit;</STRONG></P>
<P><STRONG>未选定行        /******** 但是这里说明表sal_audit中实际上没有新的记录,这是怎么回事????   ******/</STRONG></P>
<P>SQL&gt;</P>

angeloc 发表于 2006-12-4 16:30

UPDATE后你是否有COMMIT?

liugy52 发表于 2006-12-4 16:34

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

angeloc 发表于 2006-12-4 16:40

<P>UPDATE后不COMMIT是不会更新表的吧?</P>

liugy52 发表于 2006-12-4 16:50

<P>谢谢angeloc兄的提示,我记得起初表EMP中SAL列的值有几个都比较小,有几个在执行<BR>update emp set sal = sal + 300;<BR>后都满足条件 <BR>new.sal &gt; 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>

liugy52 发表于 2006-12-4 16:52

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

liugy52 发表于 2006-12-4 16:52

现在改为1000左右的,终于执行成功了。

angeloc 发表于 2006-12-4 17:40

<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 &gt; 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]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.