2015-09-28 3 views
0

Я пытаюсь получить некоторые данные из Oracle 11.2 с помощью java и jdbc-драйвера.Использование PrepareStatement для получения данных с настраиваемым именем таблицы

Моя цель - получить данные из базы данных с помощью CallableStatement, но не повезло - я не могу указать имя таблицы в качестве параметра. Я хотел бы иметь настраиваемое имя таблицы в запросе. Тем не менее, было бы неплохо сохранить его в санитарии.

Вот пример ..

public void getData() throws SQLException { 

    Connection conn = Config.getSQLConnection(); 
    String query = "SELECT * FROM ?"; 
    PreparedStatement st = conn.prepareStatement(query); 
    st.setString(1, Config.DATATABLE_NAME); 
    ResultSet rs = st.executeQuery(); 

    if (rs.next()) { 
     System.out.println("SUCCESS"); 
     System.out.println("ID:" + rs.getString("ID")); 
    } else { 
     System.out.println("FAILURE"); 
    } 
} 

ли это так, как это должно работать? Или я что-то пропустил или неправильно использовал?

+0

Отредактировано для использования PreparedStatement вместо CallableStatement – ShirouWrath

ответ

1

A CallableStatement Используется для вызова хранимых процедур.

От javadoc:

Интерфейс, используемый для выполнения SQL хранимых процедур

Используйте PreparedStament вместо для нормального выбора.

В качестве дополнительного примечания не передавайте имя таблицы в качестве параметра. Создайте запрос, используя конкатенацию.

Вместо

String query = "SELECT * FROM ?"; 

использования

String query = "SELECT * FROM " + Config.DATATABLE_NAME; 
+0

Итак, мне нужно использовать contatenation, даже когда я оставляю конфигурацию для пользователей admin? Будет ли это дезинфицировано таким образом? – ShirouWrath

+0

Вы должны проверить, как будет создан sql. Он не дезинфицирован. Но проблема в том, что имя таблицы не является параметром. Это часть запроса. Параметры могут быть представлены знаком вопроса, а не именами таблиц –

0

Вы должны использовать PreparedStatement вместо CallableStatement. CallableStatement - это интерфейс, который используется для вызова хранимых процедур.