2013-02-27 81 views
2

我是新来的Java和Oracle之间的连接,我正在设计一个登录页面。调用Oracle SQL函数

我试图从JAVA调用Oracle函数。假定Oracle函数被称为FUNCT_PERSON,其中有2个IN参数:usernamepassword,并返回用户标识。

内部,我们使用,如果发现SELECT声明和返回用户ID号FUNCT_PERSON功能,否则将返回0。

这里是我的代码:

String sql = "{ ? = call FUNCT_PERSON(?,?) }"; 
CallableStatement statement = connection.prepareCall(sql); 
statement.setString(2,username); 
statement.setString(3,password); 
statement.registerOutParameter(1, java.sql.Types.INTEGER); 

Boolean check = statement.execute(); 

if (!check) { 
//proceed to another page 
} else { 
//Go back to the login page 
} 

我不知道是什么我正在做的是对的,尤其是Boolean check = statement.execute();这一行,因为我不知道检查的内容是什么。

如果函数返回一个用户ID,表示它存在于数据库中,将继续另一页。如果不是,那么它将重定向到登录页面。

+1

你的描述是有道理的,但我不知道是什么问题是...? – 2013-02-27 19:36:56

回答

7

你只需要恢复操作的结果,并使用它来验证行动,使:

String sql = "{ ? = call FUNCT_PERSON(?,?) }"; 
CallableStatement statement = connection.prepareCall(sql); 
statement.setString(2,username); 
statement.setString(3,password); 
statement.registerOutParameter(1, java.sql.Types.INTEGER); 

statement.execute(); 
//this is the main line 
long id = statement.getLong(1); 
if (id > 0) { 
    //proceed to another page 
} else { 
    //Go back to the login page 
} 

基于this tutorial

2

JAVA Docs

执行方法返回一个布尔值指示第一 结果的形式。您必须调用方法getResultSet或getUpdateCount 来检索结果;您必须调用getMoreResults移至任何 后续结果。

返回:如果第一个结果是ResultSet对象,则返回true;如果 的第一个结果是更新计数或没有结果,则返回false

因此您的检查是错误的。 execute不会说操作是否成功。

+0

但通常情况下,我们将resultSet存储到数组或光标中,我是否正确?但我的目标仅仅是获得返回值,这是一个数字,反对一组“数字”。 因此,如果检查是真的,那么它意味着select语句返回一些值,o/w检查将是假的我是否正确? – 2013-02-27 19:46:05

+0

@Y先生在我的回答中解释过。请注意,'execute'方法的结果只是告诉你该语句是否被执行。 – 2013-02-27 19:57:41