无法通过JDBC调用oracle中的存储过程

无法通过JDBC调用oracle中的存储过程,jdbc,oracle10g,Jdbc,Oracle10g,我试图调用一个存储过程,在该过程中,我将向表中插入7个值。但是下面的代码不起作用,请告诉我我做错了什么 我没有得到任何错误,页面只是保持静态,尽管在成功执行查询后,它应该重定向到一个新页面 public class admincontrol extends TagSupport { HttpServletRequest request; HttpServletResponse response; String msg=""; public int doStartTag() throw

我试图调用一个存储过程,在该过程中,我将向表中插入7个值。但是下面的代码不起作用,请告诉我我做错了什么

我没有得到任何错误,页面只是保持静态,尽管在成功执行查询后,它应该重定向到一个新页面

   public class admincontrol extends TagSupport
 {

HttpServletRequest request;
HttpServletResponse response;
String msg="";

public int doStartTag() throws JspException
 {
       request=(HttpServletRequest)pageContext.getRequest();
       response=(HttpServletResponse)pageContext.getResponse();
       return EVAL_PAGE;
    }
     public void check ()
     {
       JspWriter out=pageContext.getOut(); 
        Connection con;
       CallableStatement stmt;
       ResultSet rs;
    try
   {
       try
        {
          Class.forName("oracle.jdbc.driver.OracleDriver");
         }
          catch(ClassNotFoundException ex)
       {
          out.println(ex.getMessage());
        }


          HttpSession mysession=request.getSession();
          String sess=(String)mysession.getAttribute("user");

       String  rr=(String)adminmodel.time.trim();
       String tempid=(String)adminmodel.employeid.trim();
       String tdept=(String)adminmodel.department.trim();
       String tsup=(String)adminmodel.supervisor.trim();
       String tact=(String)adminmodel.action.trim();
       String tdate=(String)adminmodel.date.trim();


       HttpSession session1=request.getSession();
       session1.setAttribute("requestnum",rr);

     Random rand = new Random(); 
     int r= rand.nextInt(80001) + 19999;
     String reff = String.valueOf(r); 

    if (!tempid.matches(".*[%#^<>&;'\0-].*") && !tdept.matches(".*

     [%#^<>&;'\0-].*") && !tsup.matches(".*[%#^<>&;'\0-].*"))
  {

   if (tempid.equals(sess) )
  {
  if (adminmodel.department!="" && adminmodel.supervisor!="" && adminmodel.action!="" && adminmodel.date!="" && adminmodel.time!="")
  {
     try
  {
con= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","gaurav","oracle");
 stmt=con.prepareCall("begin requestdetail (?,?,?,?,?,?,?); end;");
    stmt.setString(1,tempid);
    stmt.setString(2,tsup);
    stmt.setString(3,tdept);  
    stmt.setString(4,tact);  
    stmt.setString(5,tdate);  
    stmt.setString(6,rr);
    stmt.setString(7,reff);           
    rs=stmt.executeQuery();
   response.sendRedirect("requestnum.jsp");    
  }
   catch(SQLException ex)
  {
    out.println(ex.getMessage());
  }
   catch(Exception ex)
   {
    out.println(ex.getMessage());
   }
 }
    else 
    out.println("Enter complete details"); 
  }
    else 
    out.println("Incorrect Employee Id"); 
  }
    else
    out.println("Invalid Details "); 
 }

   catch(Exception ex)
 {

  } 
 }

  public int doEndTag() throws JspException
{

  check();
  return super.doEndTag();
 }

}

不能在查询中使用过程,只能使用函数。要执行程序,您需要执行以下操作:

stmt=con.prepareCall("{ call requestdetail (?,?,?,?,?,?,?) }");
stmt.setString(1,tempid);
stmt.setString(2,tsup);
stmt.setString(3,tdept);  
stmt.setString(4,tact);  
stmt.setString(5,tdate);  
stmt.setString(6,rr);
stmt.setString(7,reff);           
rs=stmt.execute();
或者,如果愿意,可以传递PL/SQL块:

stmt=con.prepareCall("begin; requestdetail (?,?,?,?,?,?,?); end;");
您还需要在某个时刻提交,除非您已为连接启用自动提交

另外,您正在使用
setString
设置所有参数,并且您在注释中说,该表是使用所有
varchar2
列创建的;但是您的过程需要
id
adate
atime
列的数字:

create or replace procedure requestdetail (id number, sup varchar2,
  department varchar2, aaction varchar2, adate number, atime number,
  ref number) is
如果为
tempid
tdate
rr
传递的值实际上不是数字,则会出现
数字或值错误。看起来您希望
tempid
至少是一个字符串

但是,如果它们是数字(或者顾名思义是日期)值,那么表列无论如何都应该是适当的类型,而不是所有的
varchar2
。始终使用正确的数据类型;不要试图将数字或日期存储为字符串,这只会在以后给你带来痛苦。它会影响性能,因为Oracle无法根据实际数据类型优化执行计划和索引。但更重要的是,您可能会得到无效或错误的数据,这些数据可能要过很长时间才会注意到,并且很难纠正


如果有人在你的“数字”字段中插入字符串,没有什么能阻止他们;但在某个时刻,当您使用
查询时,其中adate=1
将抛出一个错误。与日期相同,但更糟糕的是,取决于所使用的格式-即使使用单一格式,如果您认为所有内容都是DD/MM/YYYY,并且有人错误地将值输入为MM/DD/YYYY,您也不会知道;当检索到DD和MM时,它将工作(如果DD和MM都“不工作”,则不是有效或有用的错误消息。请始终说出错误或者您得到的意外行为,以及您期望发生的情况。我假设您从调用本身获得类似“错误的参数数量或类型”或“无效标识符”的信息。您的过程可能也无效;如果“编译”,第一列是否真的被称为
employee\u id
,而不是
employee\u id
使用警告“然后执行
显示错误”
从用户错误中选择*以查看错误。我已更新了整个代码,请查看。我没有收到任何错误,页面只是保持静态,尝试使用stmt=con.prepareCall({call requestdetail(?,,,,,,,,,,,,,?)})和stmt=con prepareCall(“begin;requestdetail”)(,,,,,,,,,,,;;结束;“”);什么都不管用
msg
发生了什么事?如果你没有得到预期的重定向,你可能在某个地方遇到了异常。
tempid
是否确实匹配
sess
-听起来它们在管理页面上会有所不同,但不确定这是怎么回事。这似乎是一个JSP调试问题,尽管DB调用您现在的回答是错误的…这就是问题所在,查询既没有执行,也没有得到任何异常。我在提交之前确保所有条件都满足,但仍然没有运气。您如何知道您没有得到异常-如何调用
check
,以及如何处理返回的
msg
值;它是否显示为r记录在某个地方?您正在进行什么调试以查看该方法内部发生的情况?谢谢..您还可以告诉我为什么不将数字作为字符串存储在数据库中是错误的吗?@user3337264-更新了一些背景。
create or replace procedure requestdetail (id number, sup varchar2,
  department varchar2, aaction varchar2, adate number, atime number,
  ref number) is