日期:2014-05-19  浏览次数:20583 次

java调用存储过程问题。。。。。。。。。。。。。。。。。。。。。。。
create or replace procedure p 
as 
begin
execute immediate 'select * from interface_info';
end p;


怎样获取查询出来的值啊?这样调报错,

PLS-00222: no function with name 'P' exists in this scope

Java code

        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@ip保密:1521:数据库保密", "账号保密", "密码保密");
        CallableStatement cs = con.prepareCall("{? = call p() }");
        cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
        cs.execute();
        cs.getResultSet();
        rs.close();
        con.close();



------解决方案--------------------
定义该存储过程的用户,跟JDBC的登录用户是一个么?

如果不是一个,存储过程前面指定Schema的名字。
------解决方案--------------------
不过。。。你的存储过程并没有定义 return,看起来比较诡异。

此外,也没有声明结果集游标,直接Select应该是不能返回数据的。
------解决方案--------------------
你可以Google下:JDBC Oracle 存储过程 样例

我刚才看了几个,都是说需要定义返回游标的。
------解决方案--------------------
你定义一个游标包,然后把查出来的数据放到游标包中,然后你在java中取数据,
------解决方案--------------------
没试过,但临时表应该是在数据库连接断开时才删除的。
------解决方案--------------------
你定义的存储过程返回值都没有,又如何期待java中给你返回呢?

而且,你的存储过程写的也太怪异了。
看好了:
Java code

--按照部门编号查询部门信息
Create  Or Replace  Procedure   findDeptByDeptno(p_dno In dept.deptno%Type)
Is
v_deptrec dept%Rowtype;
Begin

   Select * Into v_deptrec From dept Where deptno=p_dno;
   dbms_output.put_line('------------------------ ');
   dbms_output.put_line('部门编号: '||v_deptrec.deptno);
   dbms_output.put_line('部门名称: '||v_deptrec.dname);
   dbms_output.put_line('部门位置: '||v_deptrec.loc);
   dbms_output.put_line('------------------------ ');
   Exception When no_data_found Then
   dbms_output.put_line('该部门不存在...');

End;

------解决方案--------------------
探讨

你定义的存储过程返回值都没有,又如何期待java中给你返回呢?

而且,你的存储过程写的也太怪异了。
看好了:
Java code

--按照部门编号查询部门信息
Create Or Replace Procedure findDeptByDeptno(p_dno In dept.deptno%Type)
Is
v_deptrec dept%Rowtype;
Begin

……

------解决方案--------------------
计算你是想调用function,java中调用方式不对吧:
//获取调用的语句集
java.sql.CallableStatement cs=null;
String sql="{call ?:=get_sal(?)}";
cs=conn.prepareCall(sql);
cs.setString(2, ename);
cs.registerOutParameter(1, Types.DOUBLE);
cs.execute();
result=cs.getDouble(1);