pl/sql:可以在oracle中运行CREATE OR REPLACE PACKAGE BODY HILL.CHAXUN
IS
FUNCTION LIST_PERSON(VAR_ID1 IN PERSON.ID1%TYPE,VAR_ID2 OUT PERSON.ID2%TYPE) 
RETURN VARCHAR2 IS 
BEGIN
SELECT ID2 
INTO VAR_ID2 
FROM PERSON 
WHERE ID1 = VAR_ID1;
RETURN VAR_ID2;
END;
END;java主要代码:      conn = DriverManager.getConnection(url, user, psw);
      cstmt = conn.prepareCall("{?=call CHAXUN.LIST_PERSON(?,?)}");
      cstmt.setString(1,"1");
      cstmt.registerOutParameter(2,Types.VARCHAR);
      cstmt.executeQuery();
      String num = cstmt.getString(2);
      System.out.print(num);
报错:java.sql.SQLException: ORA-01008: not all variables bound请问各位如何修改java的代码,还有就是有没有实例可以让我参考的,我是刚刚学习新手!

解决方案 »

  1.   

    我给你给以前EJB工程中调用Oracle过程的方法,调用不同的Oracle过程的传入传出参数决定java的方法。遗憾的是我没有pl/sql的代码所以无法给你看pl/sql过程到底是什么,代码如下看看不知道有没有帮助:  public String[] call_process(String callstr,String [][] in_parameter,int[] out_parameter) throws RemoteException{
        String [][] parameter_in=in_parameter;
        int [] parameter_out=out_parameter;
        String [] return_process=new String[parameter_out.length];
        String call=callstr;
        try{
          System.out.println(call);
          if(conn==null)
            conn = connectionMgr.requestcon();
          CallableStatement cstmt = conn.prepareCall(call);
          for(int i=0;i<parameter_in.length;i++)
            for(int j=0;j<parameter_in[i].length;j++){
              if(parameter_in[i][0].equals("1"))
                cstmt.setString(1,parameter_in[i][1]);
              else
                cstmt.setInt(1 ,Integer.parseInt(parameter_in[i][1]));
            }
          for(int i=0;i<parameter_out.length;i++){
            cstmt.registerOutParameter(parameter_in.length+i+1,parameter_out[i]);
          }
          cstmt.execute();
          for(int i=0;i<return_process.length;i++)
            return_process[i]=cstmt.getString(parameter_in.length+i+1);
        }
        catch(SQLException e)
            {System.err.println("opendb.call_process():" + e.getMessage());}
        finally{closedb();}
        System.out.println(call);
        return return_process;
      }
    函数说明:
    public String[] call_process(String callstr,String [][] in_parameter,int[] out_parameter) throws RemoteException{}
    “String callstr”此参数是访问Oracle过程命令字串;
    “String [][] in_parameter,int[] out_parameter”是Oracle过程的参数,以为本例子一次需要执行多次过程所以这里是数组;返回的是一个一维数组。以下是使用这个方法的例子:
          //调用存储过程返回用户订阅得信息
          String sqlstr = "{call SHOW_USERORDER(?,?)}";
          String[][] c_in_para = new String[1][2];
          String[] c_info;
          int[] c_out_para = new int[1];
          c_in_para[0][0] = "1"; //1是字符串类型,其他是整型
          c_in_para[0][1] = P_Mobilephone_No;
          c_out_para[0] = Types.VARCHAR; //
          c_info = intfc.call_process(sqlstr, c_in_para, c_out_para); //返回给用户的数据