我在这个SQL语句中出错的地方?

时间:2011-12-26 11:58:26

标签: java sql oracle11g

我正在使用JSF,Jboss和Oracle开发一个简单的登录表单。问题是我在制作这个SQL语句时遇到了问题:

SQL_Statement = "SELECT Passwd from USERS WHERE Username = ?";

PreparedStatement passwordQuery = conn.prepareStatement(SQL_Statement);
passwordQuery.setString(1, userToCheck);

ResultSet result = passwordQuery.executeQuery();
if(result.next()){
    storedPassword = result.getString("Passwd");

这是oracle中的表结构:

CREATE TABLE "USERS"(
      "UserId" Integer NOT NULL,
      "GroupId" Integer,
      "SpecialNumber" Varchar2(60 ),
      "Username" Varchar2(50 ),
      "Passwd" Varchar2(50 ),
      "DateToChangePasswd" Date,
      "Address" Varchar2(60 ),
      "StateRegion" Varchar2(50 ),
      "Country" Varchar2(50 ),
      "AdminStatus" Varchar2(30 ),
      "Telephone" Varchar2(50 ),
      "DateUserAdded" Date,
      "UserExpireDate" Date,
      "DateUserLocked" Char(20 ),
      "City" Varchar2(50 ),
      "EMail" Varchar2(50 ),
      "Comment" Clob
    )

也许SQL语句无效?你能指出我的问题在哪里吗?

4 个答案:

答案 0 :(得分:4)

我认为这个问题是由用于声明表中列的双引号引起的。用双引号括起列名使它们区分大小写。您的选择查询会自动将Passwd转换为PASSWD。所以无法找到该列。

将您的创建表格查询更改为

CREATE TABLE USERS (
  UserId Integer NOT NULL,
  GroupId Integer,
  ...

这样,列名称将不区分大小写。

有关详细信息,请参阅http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements008.htm

答案 1 :(得分:2)

使用带引号的标识符,因此您必须使用带字段名称的双精度数。有关详细信息,请查看google book page.

试试这个,

SQL_Statement = "SELECT \"Passwd\" from USERS WHERE \"Username\" = ?";

答案 2 :(得分:1)

问题的根源在于您用引号定义了列名 ( “的passwd”)。

如果您无法更改表格(定义不带引号的列名称),则查询应为:

"SELECT \"Passwd\" from USERS WHERE Username = ?"

答案 3 :(得分:1)

在此页面上:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements008.htm您可以阅读以下内容:

  

带引号的标识符以双引号(“)开头和结尾。   如果使用带引号的标识符命名模式对象,则必须使用   每次引用该对象时都使用双引号。

因此,您的查询应如下所示:

SQL_Statement = "SELECT \"Passwd\" from USERS WHERE \"Username\" = ?";