33.3. Выполнение SQL-команд#

33.3. Выполнение SQL-команд

33.3. Выполнение SQL-команд #

Любая SQL-команда может быть выполнена из встроенного SQL-приложения. Ниже приведены некоторые примеры того, как это сделать.

33.3.1. Выполнение SQL-запросов #

Создание таблицы:

EXEC SQL CREATE TABLE foo (number integer, ascii char(16));
EXEC SQL CREATE UNIQUE INDEX num1 ON foo(number);
EXEC SQL COMMIT;

Вставка строк:

EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad');
EXEC SQL COMMIT;

Удаление строк:

EXEC SQL DELETE FROM foo WHERE number = 9999;
EXEC SQL COMMIT;

Обновления:

EXEC SQL UPDATE foo
    SET ascii = 'foobar'
    WHERE number = 9999;
EXEC SQL COMMIT;

SELECT операторы, возвращающие одну строку результата, также могут быть выполнены непосредственно с использованием EXEC SQL. Для обработки наборов результатов с несколькими строками приложение должно использовать курсор; см. ниже Раздел 33.3.2. (В качестве особого случая приложение может извлекать несколько строк сразу в массив переменных хоста; см. Раздел 33.4.4.3.1).

Выбор одной строки:

EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';

Также, параметр конфигурации можно получить с помощью команды SHOW:

EXEC SQL SHOW search_path INTO :var;

компоненты формата :something являются host variables, то есть, они относятся к переменным в программе на языке C. Они объясняются в разделе Раздел 33.4.

33.3.2. Использование курсоров #

Для получения набора результатов, содержащего несколько строк, приложение должно объявить курсор и извлекать каждую строку из курсора. Шаги для использования курсора следующие: объявить курсор, открыть его, извлечь строку из курсора, повторить этот шаг и, наконец, закрыть курсор.

Выборка с использованием курсоров:

EXEC SQL DECLARE foo_bar CURSOR FOR
    SELECT number, ascii FROM foo
    ORDER BY ascii;
EXEC SQL OPEN foo_bar;
EXEC SQL FETCH foo_bar INTO :FooBar, DooDad;
...
EXEC SQL CLOSE foo_bar;
EXEC SQL COMMIT;

Для получения дополнительной информации о объявлении курсора, см. DECLARE; для получения дополнительной информации о выборке строк из курсора, см. FETCH.

Примечание

Команда ECPG DECLARE на самом деле не приводит к отправке оператора на сервер PostgreSQL. Курсор открывается на сервере (с использованием команды DECLARE сервера) в момент выполнения команды OPEN.

33.3.3. Управление транзакциями #

В режиме по умолчанию операторы коммитятся только при выполнении команды EXEC SQL COMMIT. Встроенный SQL-интерфейс также поддерживает автоматический коммит транзакций (аналогично поведению по умолчанию в psql) с помощью опции командной строки -t для ecpg (см. ecpg) или с помощью оператора EXEC SQL SET AUTOCOMMIT TO ON. В режиме автоматического коммита каждая команда автоматически коммитится, если она не находится внутри явной транзакционной блокировки. Этот режим можно явно отключить с помощью оператора EXEC SQL SET AUTOCOMMIT TO OFF.

Доступны следующие команды управления транзакциями:

EXEC SQL COMMIT #

Зафиксировать транзакцию, находящуюся в процессе выполнения.

EXEC SQL ROLLBACK #

Откатить транзакцию, находящуюся в процессе выполнения.

EXEC SQL PREPARE TRANSACTION transaction_id #

Подготовьте текущую транзакцию для двухфазного коммита.

EXEC SQL COMMIT PREPARED transaction_id #

Зафиксировать транзакцию, находящуюся в состоянии подготовки.

EXEC SQL ROLLBACK PREPARED transaction_id #

Откатить транзакцию, находящуюся в подготовленном состоянии.

EXEC SQL SET AUTOCOMMIT TO ON #

Включить режим автоматического коммита.

EXEC SQL SET AUTOCOMMIT TO OFF #

Отключение режима автоматического коммита. Это значение по умолчанию.

33.3.4. Подготовленные операторы #

Когда значения, которые должны быть переданы в SQL-запрос, неизвестны на этапе компиляции или когда один и тот же запрос будет использоваться множество раз, подготовленные запросы могут быть полезны.

Оператор подготавливается с использованием команды PREPARE. Для значений, которые еще неизвестны, используйте заполнитель ?:

EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";

Если оператор возвращает одну строку, приложение может вызвать EXECUTE после PREPARE для выполнения оператора, указав фактические значения для заполнителей с помощью предложения USING.

EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;

Если оператор возвращает несколько строк, приложение может использовать курсор, объявленный на основе подготовленного оператора. Чтобы привязать входные параметры, курсор должен быть открыт с использованием предложения USING:

EXEC SQL PREPARE stmt1 FROM "SELECT oid,datname FROM pg_database WHERE oid > ?";
EXEC SQL DECLARE foo_bar CURSOR FOR stmt1;

/* when end of result set reached, break out of while loop */
EXEC SQL WHENEVER NOT FOUND DO BREAK;

EXEC SQL OPEN foo_bar USING 100;
...
while (1)
{
    EXEC SQL FETCH NEXT FROM foo_bar INTO :dboid, :dbname;
    ...
}
EXEC SQL CLOSE foo_bar;

Когда вам больше не нужен подготовленный запрос, вы должны его деаллоцировать:

EXEC SQL DEALLOCATE PREPARE name;

Для получения более подробной информации о PREPARE, см. PREPARE. Также см. Раздел 33.5 для получения дополнительной информации о использовании заполнителей и входных параметров.