最近开始看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包也导入了,不然程序不可能执行一半;程序不管编译还是运行还是终止全程都没报错……还有就是,小弟不知道这样的帖子放哪里合适,所以就先行放这里吧。在此感谢!
在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包也导入了,不然程序不可能执行一半;程序不管编译还是运行还是终止全程都没报错……还有就是,小弟不知道这样的帖子放哪里合适,所以就先行放这里吧。在此感谢!
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.
1.你的sql单独测试ok?
2.如果1是ok的,把procedure里面的语句改成更null;能够成功?
是不是在Java程序中不写传入的参数?如果是的话,那我已经试过了,这样Java程序是可以完全结束的,只是肯定改不了数据库内的信息。
还有就是……小弟不知道这个网站回复机制 ……不知道这样子回复对不对,呵呵,见谅见谅,但愿没错。