2014-02-25 46 views
0

我想調用一個存儲過程,我將7個值插入表中。但下面的代碼不起作用,請告訴我做錯了什麼?無法通過JDBC在oracle中調用存儲過程

我沒有得到任何錯誤,頁面只是保持靜態,雖然成功的查詢執行後,它是假設重定向到一個新的頁面。

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; 
/
+0

'不工作'不是有效或有用的錯誤消息。請始終說出你得到的錯誤或意外行爲,以及你期望發生的事情。我假設你從調用本身得到'錯誤的數字或類型的參數'或'無效標識符'。你的程序也可能是無效的;是第一列真的叫'employe_id',而不是'employee_id'?如果'編譯時有警告',那麼執行'show errors'或'select * from user_errors'來查看錯誤。 –

+0

我已經更新了整個代碼,請看看。我沒有得到任何錯誤,頁面保持靜態,嘗試使用stmt = con.prepareCall(「{call requestdetail(?,?,?,?,?,?,?)}」);和stmt = con。prepareCall(「begin; requestdetail(?,?,?,?,?,?,?); end;」);沒有任何工作 – user3337264

+0

'msg'會發生什麼?如果你沒有得到你期望的重定向,看起來你可能會在某處出現異常。 'tempid'實際上是否匹配'sess' - 聽起來像在管理頁面上會有所不同,但不知道這是做什麼。這看起來像一個JSP調試問題,雖然你現在的DB調用是錯誤的... –

回答

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 error如果你通過在tempidtdaterr值是不實際的數字。它看起來像你期望tempid至少是一個字符串。

但是,如果它們是數字(或顧名思義,日期)值,那麼你的表列應該是適當的類型,不是所有的varchar2。始終使用正確的數據類型;不要試圖將數字或日期存儲爲字符串,它只會在稍後導致你的痛苦。它會影響性能,因爲Oracle無法根據實際數據類型優化執行計劃和索引。但更重要的是,因爲你可能會得到無效的數據,或者只是很糟糕的數據,而這些數據可能在很晚之後纔會發現,並且很難糾正。

如果有人在你的'數字'字段中插入一個字符串,則不會阻止它們;但在某些時候,當您使用where adate = 1進行查詢時,它會引發錯誤。與日期相同,但更糟糕的是取決於所使用的格式 - 即使使用單一格式,如果您認爲所有內容都是DD/MM/YYYY,並且有人將錯誤的值作爲MM/DD/YYYY輸入,那麼您贏了不知道;它將在檢索時工作(如果DD和MM都是< = 12)但是具有錯誤的值,並且您將無法辨別;或者檢索時會失敗。如果該列是DATE,那麼它取決於插入的人是否正確,而不是在您檢索數據時嘗試修復錯誤。

+0

謝謝..你能告訴我爲什麼不把數字作爲字符串存儲在數據庫中? – user3337264

+0

@ user3337264 - 更新了一些背景。 [也看到這個](http://stackoverflow.com/a/10725075/266304)。 –