2013-10-14 20 views
0

我正在嘗試創建一個過程,該過程將採用員工id作爲輸入並獲取包含7列的整行數據。但是,我創建了一個過程,但是當我運行它時,它會給出一個錯誤,指出「無效標識符」。請告訴我我做錯了什麼?如何在oracle 10g中創建一個過程來獲取整行

create or replace procedure getdetails (empid number) 
    is 
    stmt varchar2 (1000); 
    begin 
    stmt :='select * from myadmin where employe_id=empid'; 
    execute immediate stmt; 
    end; 
    /

使用下面的語句執行

begin getdetails (5); 
end; 


    package pack.java; 
    import pack.java.allrequestmodel; 
    import java.io.*; 
    import java.lang.*; 
    import java.sql.*; 
    import javax.servlet.*; 
    import javax.servlet.http.*; 
    import javax.servlet.jsp.*; 
    import javax.servlet.jsp.tagext.*; 

     public class allrequestcontrol extends TagSupport 
     { 
     HttpServletRequest request; 
     HttpServletResponse response; 
     String ss=""; 
     String emp=""; 
     public int doStartTag() throws JspException 
     { 
      request=(HttpServletRequest)pageContext.getRequest(); 
      response=(HttpServletResponse)pageContext.getResponse(); 
     return EVAL_PAGE; 
     } 

     public ResultSet check() 
     {   
     HttpSession mysession=request.getSession(); 
     ss=(String)mysession.getAttribute("user"); 
     mysession.setAttribute("user",ss); 
     JspWriter out=pageContext.getOut(); 
     Connection con; 
     CallableStatement stmt; 
     ResultSet rs=null; 
      try 
     { 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     } 
     catch(ClassNotFoundException ex) 
     { 
     } 
      try 
     { 

con= DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","gaurav","oracle"); 
     stmt=con.prepareCall("call getdetails(?)"); 
     stmt.setString(1,ss); 
     rs=stmt.executeQuery(); 
     } 
     catch(SQLException ex) 
     { 
     } 

     return rs; 
     } 

     public int doEndTag() throws JspException 
     { 

     JspWriter out=pageContext.getOut(); 
     ResultSet rs= check(); 
     try 
     { 
     out.println("<table border=2>"); 
     out.println("<tr>"); 
     out.println("<th>EmployeId</th>"); 
     out.println("<th>Supervisor</th>"); 
     out.println("<th>Department</th>"); 
     out.println("<th>PickDate.</th>"); 
     out.println("<th>PickTime</th>"); 
     out.println("<th>DropDate</th>"); 
     out.println("<th>DropTime</th>"); 
     out.println("<th>Status</th>"); 
     out.println("<th></th>"); 
     out.println("</tr>"); 
     while(rs.next()) 
    { 
    out.println("<tr>"); 
    out.println("<td>"+rs.getString(1)+"</td>"); 
    out.println("<td>"+rs.getString(2)+"</td>"); 
    out.println("<td>"+rs.getString(3)+"</td>"); 
    out.println("<td>"+rs.getString(4)+"</td>"); 
    out.println("<td>"+rs.getString(5)+"</td>"); 
    out.println("<td>"+rs.getString(6)+"</td>"); 
    out.println("<td>"+rs.getString(7)+"</td>"); 
    out.println("<td>"+rs.getString(8)+"</td>"); 
    out.println("<td><input type=radio name=radio value="+rs.getString(8)+"></td>"); 
    out.println("</tr>"); 
    } 
    emp=(String)request.getParameter("radio"); 
    HttpSession mysession=request.getSession(); 
    mysession.setAttribute("deleteemp",emp); 
    } 
    catch(Exception ex) 
    { 
    } 

    return super.doEndTag(); 
    } 
} 
+2

爲什麼使用動態SQL? –

+2

你需要選擇「進入」某物。 –

+0

其實我是新來的PL/SQL,所以我自學。我很困惑是否使用函數或過程來獲取整行? 和你建議我需要選擇的東西,我不知道如何去做,因爲我嘗試使用「雙」它不允許 – Gaurav

回答

0

PL/SQL允許你使用SQL直接,你不需要動態SQL(立即執行),在這種情況下。

此外,您可以選擇一整行到ROWTYPE變量中,這將成爲與表中的行相同的結構的記錄類型。例如:

procedure getdetails (empid number) 
is 
    my_rec myadmin%ROWTYPE; 
begin 
    select * 
    INTO my_rec 
    from myadmin 
    where employe_id=empid; 
    -- now you can refer to my_rec.employe_id, etc. 
end; 
+0

謝謝。此外,我通過JDBC(已更新上面的代碼)調用此過程以顯示與特定(empid)關聯的行,但代碼不顯示任何內容。請告訴我我做錯了什麼? – Gaurav

+0

您需要對返回的記錄進行一些操作 - 例如使用OUT參數將結果返回給調用進程。 –