DB2 – система управления реляционными базами данных. Заданное число упорядоченных столбцов и неупорядоченные строки, страница 22

WHERE NAME LIKE ‘Smith’ в противоположность к

WHERE NAME LIKE :search_name

В большинстве случаев, статический SQL будет выполняться быстрее чем динамический SQL, но если Вы сомневаетесь, закодируйте оба варианта SQL и протестируйте их.


Использование SQL-оператора PREPARE

  • Поместите SQL-оператор в  host-переменную

CHAR CRE_TAB [80] = “CREATE TABLE …”

  • Используйте SQL-оператор PREPARE для создания плана доступа для оператора в host-переменной
  • Используйте оператор EXECUTE для выполнения запроса
  • Предложение SQLEXECUTEIMMEDIATE также может использоваться, но с меньшей эффективностью

При использовании динамического SQL мы должны выполнить следующие четыре шага:

  1. Первым делом, мы должны продекларировать host-переменную, которая будут содержать наш SQL оператор.
  1. Затем мы должны поместить SQL оператор в переменную. Он может быть введен пользователем или скопирован из другого источника.
  1. После этого выполняем оператор PREPARE. Анализируется SQL.
  1. В заключении, мы выполняем оператор EXECUTE, в результате чего динамически выполняется SQL оператор.

Приготовление и выполнение предложений динамического SQL-оператора

EXEC SQL BEGIN DECLARE SECTION;

char dropit [80] = “DROP TABLE CRIMES”;

EXEC SQL END DECLARE SECTION;

EXEC SQL

PREPARE do_drop

FROM :dropit;

EXEC SQL

EXECUTE do_drop;

В этом примере мы декларируем host-переменную с именем dropit. Эта переменная содержит наш SQL-оператор.

Затем мы выполняем PREPARE; именуем приготовленный оператор (имя do_drop).

Наконец мы выполняем оператор EXECUTE do_drop и удаляем таблицу.


Использование SQL-оператора EXECUTEIMMEDIATE

EXEC SQL BEGIN DECLARE SECTION;

char dropit [80] = “DROP TABLE CRIMES”;

EXEC SQL END DECLARE SECTION;

EXEC SQL

EXECUTE IMMEDIATE :dropit;

Альтернативный способ по сравнению с PREPARE и EXECUTE – использование EXECUTE IMMEDIATE. В этом случае приготовление и выполнение выполняется за один шаг.


Использование параметров в динамическом SQL

  • Динамический SQL не может содержать host-переменные, т. к. информация доступна только в момент прекомпиляции, например:

UPDATE T1… WHERE C1 = :HOSTVAR

  • Динамический SQL может содержать маркеры параметров
  • Символы ‘?’ используются чтобы обозначить маркер параметра
  • Маркеры параметров могут указывать на host-переменные

Host-переменные не могут быть использованы в динамическом SQL-операторе.

Мы размещаем в SQL-операторе символ ‘?’ на каждом месте, где требуется параметр. В предложении USING оператора EXECUTE перечисляем имена host-переменных. DB2 затем подставляет вместо ‘?’ значение соответствующей host-переменной из списка.


Использование маркеров параметров

EXEC SQL BEGIN DECLARE SECTION;

short wanted;

char zap[80] = “DELETE FROM CRIMES WHERE CRIME_CODE = ?”;

EXEC SQL END DECLARE SECTION;

EXEC SQL

PREPARE gone

FROM :zap;

EXEC SQL

EXECUTE gone

USING :wanted;

В предложении WHERE оператора DELETE мы сравниваем CRIME_CODE с параметром. В предложении EXECUTE маркер параметра заменяется значением host-переменной с именем wanted.



/****************************************************************/

/*   S001                                                                                                                 */

/*   Пример использования статического SQL с host-переменными              */

/*   Использование индикаторных переменных                                               */

/****************************************************************/

#include <stdlib.h>

#include <stdio.h>

EXEC SQL INCLUDE SQLCA;

char s??(30??);

class WORK

{

private:

EXEC SQL BEGIN DECLARE SECTION;

char firstname??(10??);

char lastname??(12??);

char address??(13??);

char phone??(8??);

char datetime??(23??);

long int salary;

short int identifier;

short int indicator;