Я хочу отсортировать инструкцию SQL на основе ввода пользователем, используя preparedStatement
. У меня есть student
стол с тремя колоннами id
, name
и age
, и пользователь может выбрать, какие колонки результаты сортируются по.
try
{
System.out.println("Enter the column name to sort the data with");
Scanner sc=new Scanner(System.in);
String str=sc.next();
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","SYSTEM","SYSTEM");
if(str.equals("id"))
{
String query="select * from STUDENT order by ?";
PreparedStatement pst=con.prepareStatement(query);
pst.setString(1,"id");
pst.executeUpdate();
}
if(str.equals("name"))
{
String query="select * from STUDENT order by ?";
PreparedStatement pst=con.prepareStatement(query);
pst.setString(1,"name");
pst.executeUpdate();
}
if(str.equals("age"))
{
String query="select * from STUDENT order by ?";
PreparedStatement pst=con.prepareStatement(query);
pst.setString(1,"age");
pst.executeUpdate();
}
}
catch(Exception e)
{
e.printStackTrace();
}
Это не так, как работают подготовленные операторы: вы пытаетесь построить динамический SQL, тогда как подготовленный оператор выдает инструкцию SQL вместе со связанными переменными, которые не могут использоваться для имен столбцов или таблиц.
Таким образом, вы можете сделать это:
String query="select * from STUDENT where some_col = ?";
PreparedStatement pst=con.prepareStatement(query);
pst.setString(1,"some_value");
pst.executeUpdate();
но не это:
String query="select * from ?";
PreparedStatement pst=con.prepareStatement(query);
pst.setString(1,"STUDENT");
pst.executeUpdate();
поскольку вы не можете использовать переменные "заполнители" для таблиц или других объектов базы данных.