我正在尝试调用存储过程,我将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;
/
答案 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
列创建的;但您的程序预计会有id
,adate
和atime
列的数字:
create or replace procedure requestdetail (id number, sup varchar2,
department varchar2, aaction varchar2, adate number, atime number,
ref number) is
如果您为numeric or value error
,tempid
和tdate
传入的值实际上不是数字,那么这将获得rr
。看起来你期望tempid
至少是一个字符串。
但是如果它们是数字(或者,顾名思义,日期)值,那么表格列应该是适当的类型,而不是所有varchar2
。始终使用正确的数据类型;不要试图将数字或日期存储为字符串,它只会让你以后痛苦。它会影响性能,因为Oracle无法根据实际数据类型优化执行计划和索引。但更重要的是因为你可以得到无效或者只是坏的数据,这些数据可能要到很晚才能注意到,并且很难纠正。
如果有人在您的“号码”字段中插入字符串,则不会阻止它们;但在某些时候,当您使用where adate = 1
进行查询时,它会抛出错误。与日期相同,但更糟糕的取决于所使用的格式 - 即使使用单一格式,如果您认为所有内容都是DD / MM / YYYY并且有人错误地将值放入MM / DD / YYYY,您又赢了不知道;并且它将在检索时工作(如果DD和MM都是&lt; = 12)但是具有错误的值并且您将无法分辨;或者它在检索时会失败。如果列是DATE
,那么由插入的人来决定是否正确,而不是由您来检索数据时尝试修复错误。