7

カスタム タグを使用してログイン ページを作成しています。以下のコードでは、格納された 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;
4

5 に答える 5

4

最初に、proc が数値を返すと言いますが、コードは文字列を返す結果セットを期待していますか? とにかく、proc が int を返すと仮定します。これらの行を変更します

    stmt=con.prepareCall("call usercheck1(?,?)");

    stmt.setString(1,aa);
stmt.setString(2,bb);       
    rs=stmt.executeUpdate();

    stmt=con.prepareCall ("{? = call usercheck1(?, ?)}");

    stmt.registerOutParameter (1, Types.INTEGER);
    stmt.setString(2,aa);       
     stmt.setString(3,bb);
    stmt.execute(); 
    int output =stmt.getInt (1);

proc の結果として実際に文字列を期待している場合は、次のように変更します。

    stmt=con.prepareCall ("{? = call usercheck1(?, ?)}");

    stmt.registerOutParameter (1, Types.VARCHAR2);
    stmt.setString(2,aa);       
     stmt.setString(3,bb);
    stmt.execute(); 
    String output =stmt.getString (1);

ResultSet はカーソルに使用され、out パラメータをそのように指定する必要があります。それが役立つことを願っています。

http://docs.oracle.com/cd/A84870_01/doc/java.816/a81354/samapp2.htm

新しいバージョンの oracle >= 9i を使用している場合は、begin end 構文を使用することをお勧めします。

于 2013-10-12T13:59:00.603 に答える
0

executeUpdate()詳細については、こちらintを参照してください。私はあなたが期待していると信じています、ResultSet

下の行を変更し、

 rs=stmt.executeUpdate();

rs=stmt.executeQuery();

詳細については、 executeQueryを参照してください。

于 2013-10-12T11:09:59.107 に答える