最近开始看pl/sql,所以写了几个很简单的代码进行测试。
在oracle内直接测试时无任何问题,于是继续学习,然后碰到一个问题:
用Java操作pl/sql块的时候,程序无法继续执行(没有异常也没有报错)……
想请各位大侠帮忙,给小弟解释一下是个什么情况…………
一下附上源代码:
oracle pl/sql部分:
--进入数据库,用户为scott,用到其中emp表
SQL> create procedure test(name varchar2,newsal number)
SQL> is
SQL> begin
SQL> update emp set sal=newsal where ename=name;
SQL> end;
SQL> /Java部分:
package myOracle.normaljava;
import java.sql.*;
public class PLSQLtest1 {
public static void main(String[] args)
{
//1.加载驱动
try {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");

//2.得到链接
Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","SCOTT","tiger");
System.out.println("OK!");//阶段测试标识
//3.创建CallableStatement
CallableStatement cs=ct.prepareCall("{call test(?,?)}");
//4.给问号赋值
cs.setString(1,"SMITH");//注意:此处的'1'为第一个问号之意,下同!
              cs.setInt(2,5200);
System.out.println("RIGHT!");//阶段测试标识

//5.执行
cs.execute();//阶段测试标识
                           //cs.execute();执行到这里这里就卡了,执行不了,上面程序完全正常

System.out.println("SUCCESS!");//阶段测试标识
//6.关闭
cs.close();
ct.close();

catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}运行结果:
OK!
RIGHT!之后本来应该打印success的,但是execute方法一直在执行,所以没有反应……稍后做的测试:将'SMITH'改为一个不存在的用户,结果程序运行结束了,'success'也可以打印出来,个人判断是可以与数据库进行交互的,在数据库无法更新数据时报错,Java程序得以继续执行。小弟不明白的是为什么在数据验证成功的时候会交互那么长时间不成功……望各位前辈高人赐教
小弟在此先行谢过!
P.S. 服务完全打开了,jar包也导入了,不然程序不可能执行一半;程序不管编译还是运行还是终止全程都没报错……还有就是,小弟不知道这样的帖子放哪里合适,所以就先行放这里吧。在此感谢!

解决方案 »

  1.   

    SQL> create procedure test(name varchar2,newsal number)
    SQL> is
    SQL> begin
    SQL> update emp set sal=newsal where ename=name;
    SQL> end;
    SQL> /
    上面的必须commit;修改为
    create procedure test(name varchar2,newsal number)
    is
    begin
    update emp set sal=newsal where ename=name;
    commit;
    end;然后你管你你数据库的所有session.从新来一次,希望对你有帮助。
    我想你可能是没有commit;你想要update的那几行资源被占用,所以你在执行的时候就会wait.
      

  2.   

    先做这样的测试:
    1.你的sql单独测试ok?
    2.如果1是ok的,把procedure里面的语句改成更null;能够成功?
      

  3.   

    呃……首先感谢,然后就是我忘了说,我开的是oracle 11g版本的sqlplus,就是那个黑屏的操作界面,视频上开的是sql developer界面。然后如果我把sqlplus关闭之后在操作就能够成功。但是不关闭就不行,一直在等待,可否麻烦您解释下这个是为什么,和那两个操作界面有没有什么关系?
      

  4.   

    第二句的意思我不太明白……
    是不是在Java程序中不写传入的参数?如果是的话,那我已经试过了,这样Java程序是可以完全结束的,只是肯定改不了数据库内的信息。
      

  5.   

    十分感谢,用你的方法确实可以修改数据库了,小弟的疑惑也解决了很大一部分。只是还有几个问题没有想清楚:1.为何视频课程上的做法能够成功?其上并没有加提交关键字;2.貌似oracle的表一般都是可读写形式吧,那我在读的同时应该也可以写入数据并不影响啊,是不是因为读写的时候是2个不同用户在操作而以上程序只是1个用户操作?3.可不可以在不加commit关键字的情况下也可以使用?不过总之还是谢谢你。小弟刚开始学这个,对一些用法和规范都不甚了解,问题可能水了一点,感谢你让我学到一些知识。
    还有就是……小弟不知道这个网站回复机制 ……不知道这样子回复对不对,呵呵,见谅见谅,但愿没错。