任何人都可以帮助我java.sql.SQLException:ORA-00936:缺少表达式

时间:2014-07-21 09:26:16

标签: java sql jsp jdbc

package controller;

import pojo.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;




public class JdbcConn {
    int found=0;
    public boolean register(Member c)
    {
        Connection conn=null;
        Statement stmt =null;
        ResultSet rs = null;
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn= DriverManager.getConnection("jdbc:oracle:thin:@localhost","system","system");
            stmt=conn.createStatement();
            System.out.println("Data base is connected");
            rs= stmt.executeQuery("select USERID from member");
            System.out.println("Hi");
            while(rs.next())
            {
                System.out.println("bye");
                if((c.getUserId()).equals(rs.getString(1)) )
                {
                    System.out.println("bye");
                    found=1;
                    break;
                }
            }

            if(found==1)
            {
                return false;
            }
            else
                stmt.executeUpdate("insert into member values ('"+ c.getName() +"','"+c.getEmail()+ "','"+c.getMobileNo()+ "','"+c.getAddress1()+"',,'"+c.getAddress2()+"','"+c.getUserId()+"','"+c.getPassword()+"','"+c.getSecretQuestion()+"','"+c.getSecretAnswer()+"')");

                return true;
        }
        catch(ClassNotFoundException e)
        {
            System.out.print(e);
            e.printStackTrace();
        }
        catch(SQLException e)
        {
            System.out.print(e);
        }
        return false;
    }




    public boolean login(String userid, String password)
    {
        Connection conn=null;
        Statement stmt =null;
        ResultSet rs = null;    
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost","system","system");
            stmt=conn.createStatement();

            rs= stmt.executeQuery("select userid, password from member where userid = '"+userid+"'");
            if(rs==null)
            {
                return false;
            }   

            else
            {
                while(rs.next())
                {
                    String uid,pass;
                    uid=rs.getString(1);
                    pass=rs.getString(2);
                    if(password.equals(pass))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }

        }
        catch(ClassNotFoundException e)
        {
            System.out.print(e);
        }
        catch(SQLException e)
        {
            System.out.print(e);
        }
        return false;
    }

}

我从一个servlet调用代码。它显示了以下输出。虽然相同的代码在其他地方正常工作:

输出:

Data base is connected
Hi
java.sql.SQLException: ORA-00936: missing expression

任何人都可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:2)

在您的插页中,您有以下

+c.getAddress1()+"',,'"+c.getAddress2()+

应该只有一个逗号而不是两个

答案 1 :(得分:1)

我建议使用PreparedStatement来避免此类错误。

使用PreparedStatement优于Statement

的优势
  • SQL语句为precompiled并存储在PreparedStatement对象中。
  • 此对象可用于efficiently多次执行此语句。
  • 缩短执行时间。
  • 通过内置转义引号和其他特殊字符自动预防SQL injection attacks

了解更多PreparedStatements and performance

请参阅Using Prepared Statements

上的 Java Tutorial

示例代码:

String insertTableSQL = "INSERT INTO DBUSER"
        + "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) VALUES"
        + "(?,?,?,?)";
PreparedStatement preparedStatement = dbConnection.prepareStatement(insertTableSQL);
preparedStatement.setInt(1, 11);
preparedStatement.setString(2, "mkyong");
preparedStatement.setString(3, "system");
preparedStatement.setTimestamp(4, getCurrentTimeStamp());
// execute insert SQL stetement
preparedStatement .executeUpdate();

在此处查找完整的Sample example以了解详情。

答案 2 :(得分:0)

  1. 使用预准备语句来避免此类问题。这也可以避免由于某些特殊字符(如单引号等)而可能遇到的问题。

  2. 如果没有,请尝试以下操作之一:

    1. 如果address1和address2之间没有列,则使用下面的内容(删除额外的逗号):

      String query = " stmt.executeUpdate("insert into member values ('"+ c.getName() +"','"+c.getEmail()+ "','"+c.getMobileNo()+ "','"+c.getAddress1()+"','"+c.getAddress2()+"','"+c.getUserId()+"','"+c.getPassword()+"','"+c.getSecretQuestion()+"','"+c.getSecretAnswer()+"')"); "; stmt.executeUpdate (query);

    2. 如果应该插入一个空值,则使用下面的内容(使用','插入一个空字段)

      String query = " stmt.executeUpdate("insert into member values ('"+ c.getName() +"','"+c.getEmail()+ "','"+c.getMobileNo()+ "','"+c.getAddress1()+"', '' ,'"+c.getAddress2()+"','"+c.getUserId()+"','"+c.getPassword()+"','"+c.getSecretQuestion()+"','"+c.getSecretAnswer()+"')"); "; stmt.executeUpdate (query);

答案 3 :(得分:0)

insert语句中,您可以指定插入/更新哪些列对应于具有insert into member (col1, col2) values (val1, val2)的SQL语法。在括号中values之前和之后,列数应该完全相同。导致错误的列数或值不正确。