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;
компоненты формата
:
являются
host variables, то есть, они относятся к
переменным в программе на языке C. Они объясняются в разделе Раздел 33.4.
something
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 для получения дополнительной информации о
использовании заполнителей и входных параметров.