Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Доступ до баз даних з Java.doc
Скачиваний:
1
Добавлен:
20.11.2019
Размер:
71.68 Кб
Скачать

Попередньо відкомпільовані (підготовлені) запити

При необхідності виконання схожих SQL-операторів декілька разів використання підготовлених операторів виявляється більш ефективнішим, ніж виконання кожного разу одного і того ж оператора із різними значеннями параметрів. Створюється параметризований оператор стандартного виду, який надсилається БД на компіляцію перед тим, як він використовуватиметься. Для позначення місць у запиті, де підставлятимуться реальні значення параметрів, використовують знаки питання. Кожного разу при використанні підготовлених операторів достатньо замінити один з параметрів за допомогою методів setXxx. Потім викликається метод executeQuery або executeUpadate.

Приклад:

. . .

Connection connection = DriverManager.getConnection(URL, username, password);

String Template = “UPDATE employees SET Salary = ? WHERE id = ?”;

PrearedStatement statement = connection.prepareStatement(template);

Float[] newSalaries = getNewSalaries();

Int[] employeeIDs = getIDs();

for(int i=0; i<employeeIDs.length; i++)

{

statement.setFloat(1, newSalaries[i]);

statement.setInt(2, employeeIDs[i]);

statement.execute();

}

. . .

Пакетное выполнение sql запросов

Иногда требуется выполнить несколько SQL запросов один за другим скажем: вставить запись, обновить другую запись и т. д. Для таких случаев принято использовать механизм пакетного (batch) выполнения SQL запросов:

st = con.createStatement();

st.addBatch("INSERT INTO CUSTOMER VALUES (10, 'John', 1000)");

st.addBatch("UPDATE CUSTOMER SET SALARY = 250 WHERE ID = 1");

st.addBatch("UPDATE CUSTOMER SET SALARY = 350 WHERE ID = 2");

int[] results = st.executeBatch();

Результатом выполнения будет массив целых чисел, каждый элемент массива соотвествует одному запросу, значения элементов расшифровываются так:

  • больше или равно «0» выполнение успешное и количество обновленных записей равно значению элемента;

  • «-2» выполнение успешное, но количество записей затронутых обновлением неизвестно;

  • «-3» выполнение неуспешное, но при этом выполнение следующей команды в пакете продолжено.

Вызов хранимых процедур и функций

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

Рассмотрим пример использования хранимой функции getSumSalary, возвращающей сумму полей SALARY для всех ID, которые меньше величины указанной в аргументе. Для вызова хранимой процедуры/функции используется субинтерфейс PreparedStatement — CallableStatement. Пример вызова нашей хранимой функции будет выглядеть так:

CallableStatement cst = con.callableStatement("{? = call getSumSalary(?)}");

cst.setInt(2, 10);

cst.registerOutParameter(1, java.sql.Types.DOUBLE);

cst.execute();

System.out.println("Sum salary for id < 10 = " + cst.getDouble(1));

Следует обратить внимание на фигурные скобки — это часть синтаксиса вызова хранимых процедур. В некоторых случаях синтаксис вызова хранимых процедур может отличаться, например указанный пример для Oracle можно написать и так:

{begin :1 = getSumSalary(:2); end;}