java - 如何从 jdbc 调用存储函数?

标签 java oracle jdbc

我正在使用自定义标记创建一个登录页面,在下面的代码中我想执行一个存储的 oracle 函数,该函数将采用 2 个参数(名称、密码)来进行身份验证并返回一个数字。但是当我编译下面的代码时,它给出了一个错误,说 ( found: int) incompatible type 。请告诉我哪里出错了?我是否正确调用了函数?

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

public class MyController extends TagSupport
{
    HttpServletRequest request;
    HttpServletResponse response;

    public int doStartTag()throws JspException
    {
        request = (HttpServletRequest)pageContext.getRequest();              
        response = (HttpServletResponse)pageContext.getResponse();
        return EVAL_PAGE;
    }   

    public void check()
    {
        HttpSession mysession = request.getSession();
        Connection con;
        CallableStatement stmt;
        JspWriter out = pageContext.getOut();
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }
        catch(ClassNotFoundException ex) {}
        try {         
            String aa = (String)MyModel.name.trim();
            String bb = (String)MyModel.pass.trim();
            con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","gaurav","oracle");
            stmt = con.prepareCall("select usercheck1(?,?) from dual");
            stmt.setString(1, aa);
            stmt.setString(2, bb);       
            rs = stmt.executeQuery();
            try {
                while (rs.next()) {
                    String empid = rs.getString (1);
                    mysession.setAttribute("user", empid);
                    if (empid != null) {
                        response.sendRedirect("/Myjsp/selectaction.jsp");
                    }
                    else
                        out.println("InValid User");
                }
            }
            catch(Exception ex) {}
        }
        catch(SQLException ex) {}
    }

    public int doEndTag() throws JspException {
        check();
        return EVAL_PAGE;
    }
}

下面是存储函数

create or replace function usercheck1
    (uname varchar2, upass varchar2)
    return number
as 
    numb number;
begin
    select (employe_id)
      into numb
      from record
     where name = uname
       and password = upass;
    return numb;
end usercheck1;
/

使用下面的语句执行函数

select usercheck1 ('ghg','aa') from dual;

最佳答案

要执行函数,规范的方法是使用 CallableStatement .这是 PreparedStatement 的特例(子类)。

此外,您必须使用 registerOutParameter 之一指定正确 输出参数类型方法。调用完成后 (execute),您可以从语句本身中提取输出值。不是通过 ResultSet

所有这些都会导致类似这样的事情:

CallableStatement stmt = con.prepareCall("{? = call usercheck1(?, ?)}");
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Prepare a `call`

stmt.registerOutParameter(1, Types.INTEGER);
# Setup out parameter type    ^^^^^^^^^^^^^

stmt.setString(2,aa);       
stmt.setString(3,bb);
stmt.execute(); 
#    ^^^^^^^
# execute the statement

int output = stmt.getInt(1);
#            ^^^^^^^^^^^
# Extract the result from the statement itself

一种完全不同的做法是实际使用 SELECT 查询来调用该函数。这是 OP 在问题中提出的建议。这样,您就可以像往常一样使用 ResultSet 来提取值:

PreparedStatement stmt = con.prepareStatement("SELECT usercheck1(?, ?) FROM DUAL");
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Prepare a statement

stmt.setString(2,aa);       
stmt.setString(3,bb);
ResultSet rs = stmt.executeQuery(); 
#                   ^^^^^^^^^^^^
# execute the query

while(rs.next()) {
  int output = rs.getInt(1);
  #            ^^^^^^^^^
  # Extract the result from the `ResultSet`

  # ...
  # do whatever you want with the data

}

关于java - 如何从 jdbc 调用存储函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19333011/

相关文章:

java - 有人有java注释 "java.lang.Synthetic"的背景吗?

sql - Oracle SQL 中的这 2 个左连接之间有区别吗?为什么

oracle - 在 sys_refcursor 中使用 oracle 游标

java - 是否可以使用 JDBC 将数据从 Oracle 传输到 Teradata,反之亦然?

hadoop - 无法通过 JDBC 更新配置单元表

java - 足球数据 API JSON 解析错误

java - 应用程序与应用程序测试 : different event dispatch?

java - 如何防止LinkedHashMap替换Key/Value?

java - 为什么相同的代码在oracle存储的java过程中会比在常规java中慢?

java - 关于 Oracle 教程拼写错误的确认