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 для получения дополнительной информации о использовании заполнителей и входных параметров.