Любая команда SQL может быть выполнена из приложения с внедренным 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 напрямую. Для обработки результирующих наборов, содержащих несколько строк, приложение должно использовать курсор; см. Раздел 4.3.3.2 ниже. (В качестве особого случая приложение может извлекать сразу несколько строк в главную переменную типа массив; см. Раздел 4.3.4.4.3.1.)
Выборка одной строки (SELECT):
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
Кроме того, значение параметра конфигурации можно получить с помощью
SHOW команды:
EXEC SQL SHOW search_path INTO :var;
Токены в формате
: are
главные переменные, то есть они ссылаются на переменные в программе на языке C. Они описаны в Раздел 4.3.4.
something
Для получения результирующего набора, содержащего несколько строк, приложение должно объявить курсор и извлечь каждую строку из этого курсора. Процесс использования курсора включает следующие шаги: объявление курсора, выполнение оператора OPEN, извлечение строки из курсора, повторение и, наконец, закрытие курсора.
Выборка данных с использованием курсоров:
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 выполняется данная команда.
В режиме по умолчанию фиксация инструкций выполняется только в том случае, когда
EXEC SQL COMMIT выполняется. Интерфейс внедренного SQL также поддерживает автоматическую фиксацию транзакций (аналогично
psqlповедению по умолчанию) с помощью -t
параметра командной строки для ecpg (см. ecpg) или с помощью EXEC SQL SET AUTOCOMMIT TO
ON statement. В режиме автоматической фиксации (autocommit) каждая команда фиксируется автоматически, за исключением случаев, когда она выполняется внутри явного блока транзакции. Данный режим можно явно отключить, используя 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 #Отключить режим автоматической фиксации. Данный вариант используется по умолчанию.
Если значения, передаваемые в SQL-оператор, неизвестны на этапе компиляции или один и тот же оператор должен быть выполнен многократно, целесообразно использовать подготовленные операторы.
Подготовка оператора осуществляется с помощью команды PREPARE. Для указания значений, которые еще неизвестны, используйте плейсхолдер «?»:
EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";
Если оператор возвращает одну строку, приложение может вызвать оператор EXECUTE после
PREPARE оператор EXECUTE для выполнения подготовленного выражения, передавая фактические значения для плейсхолдеров через USING
clause:
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;
/* когда достигнут конец набора результатов, выйти из цикла while */
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 имя;
Для получения подробной информации о PREPARE,
см. PREPARE. Также
см. Раздел 4.3.5 для получения подробной информации об использовании
заполнителей и входных параметров.