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

时间:2014-02-25 09:35:07

标签: jdbc oracle10g

我正在尝试调用存储过程,我将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();
 }

}

以下是存储过程

create or replace procedure requestdetail (id number, sup varchar2, department       varchar2,aaction varchar2, adate number,atime number, ref number)
is
begin
insert into myadmin(employe_id,supervisor,department,action,sdate,stime,reference_no)values (id,sup,department,aaction,adate,atime, ref);
end;
/

1 个答案:

答案 0 :(得分:0)

您不能在查询中使用过程,只能使用函数。要执行您需要执行的过程:

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;");

除非您为连接启用了自动提交,否则您还需要commit

此外,您使用setString设置所有参数,并在评论中说该表是使用所有varchar2列创建的;但您的程序预计会有idadateatime列的数字:

create or replace procedure requestdetail (id number, sup varchar2,
  department varchar2, aaction varchar2, adate number, atime number,
  ref number) is

如果您为numeric or value errortempidtdate传入的值实际上不是数字,那么这将获得rr。看起来你期望tempid至少是一个字符串。

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

如果有人在您的“号码”字段中插入字符串,则不会阻止它们;但在某些时候,当您使用where adate = 1进行查询时,它会抛出错误。与日期相同,但更糟糕的取决于所使用的格式 - 即使使用单一格式,如果您认为所有内容都是DD / MM / YYYY并且有人错误地将值放入MM / DD / YYYY,您又赢了不知道;并且它将在检索时工作(如果DD和MM都是&lt; = 12)但是具有错误的值并且您将无法分辨;或者它在检索时会失败。如果列是DATE,那么由插入的人来决定是否正确,而不是由您来检索数据时尝试修复错误。