35.3. ÐапÑÑк команд SQL
РпÑиложении Ñо вÑÑÑаиваемÑм SQL можно запÑÑÑиÑÑ Ð»ÑбÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL. Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð½ÐµÑколÑко пÑимеÑов, показÑваÑÑÐ¸Ñ ÐºÐ°Ðº ÑÑо делаÑÑ.
35.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. ЧÑÐ¾Ð±Ñ Ð¾Ð±ÑабоÑаÑÑ Ð½Ð°Ð±Ð¾ÑÑ ÑезÑлÑÑаÑов Ñ Ð½ÐµÑколÑкими ÑÑÑоками, пÑиложение должно иÑполÑзоваÑÑ ÐºÑÑÑоÑÑ; Ñм. ÐодÑаздел 35.3.2 ниже. (РоÑделÑнÑÑ
ÑлÑÑаÑÑ
пÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑко ÑÑÑок в пеÑеменнÑÑ Ð¼Ð°ÑÑива; Ñм. ÐодÑаздел 35.4.4.3.1.)
ÐÑбоÑка одной ÑÑÑоки:
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
Так же можно полÑÑиÑÑ Ð¿Ð°ÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии командой SHOW:
EXEC SQL SHOW search_path INTO :var;
ÐденÑиÑикаÑоÑÑ Ð²Ð¸Ð´Ð° : воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº пеÑеменнÑе ÑÑедÑ, Ñо еÑÑÑ Ð¾Ð½Ð¸ ÑÑÑлаÑÑÑÑ Ð½Ð° пеÑеменнÑе пÑогÑÐ°Ð¼Ð¼Ñ C. Ðни ÑаÑÑмаÑÑиваÑÑÑÑ Ð² Разделе 35.4.имÑ
35.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.
ÐÑимеÑание
Ðоманда DECLARE в ECPG на Ñамом деле не пеÑедаÑÑ ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑеÑвеÑÑ Postgres Pro. ÐÑÑÑÐ¾Ñ Ð¾ÑкÑÑваеÑÑÑ Ð½Ð° ÑеÑвеÑе (командой ÑеÑвеÑа DECLARE) в моменÑ, когда вÑполнÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° OPEN.
35.3.3. УпÑавление ÑÑанзакÑиÑми
Ð Ñежиме по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑÑ ÑикÑиÑÑÑÑÑÑ ÑолÑко когда вÑполнÑеÑÑÑ EXEC SQL COMMIT. ÐнÑеÑÑÐµÐ¹Ñ Ð²ÑÑÑаиваемого SQL Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð°Ð²ÑоÑикÑаÑÐ¸Ñ ÑÑанзакÑий (Ñак ÑабоÑÐ°ÐµÑ libpq по ÑмолÑаниÑ); она вклÑÑаеÑÑÑ Ð°ÑгÑменÑом командной ÑÑÑоки -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ид_ÑÑанзакÑииÐодгоÑовиÑÑ ÑекÑÑÑÑ ÑÑанзакÑÐ¸Ñ Ð´Ð»Ñ Ð´Ð²ÑÑ Ñазной ÑикÑаÑии.
EXEC SQL COMMIT PREPAREDид_ÑÑанзакÑииÐаÑикÑиÑоваÑÑ ÑÑанзакÑÐ¸Ñ Ð² подгоÑовленном ÑоÑÑоÑнии.
EXEC SQL ROLLBACK PREPAREDид_ÑÑанзакÑииÐÑкаÑиÑÑ ÑÑанзакÑÐ¸Ñ Ð² подгоÑовленном ÑоÑÑоÑнии.
EXEC SQL SET AUTOCOMMIT TO ONÐклÑÑиÑÑ Ñежим авÑоÑикÑаÑии.
EXEC SQL SET AUTOCOMMIT TO OFFÐÑклÑÑиÑÑ Ñежим авÑоÑикÑаÑии. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½ оÑклÑÑÑн.
35.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;
/* по доÑÑижении конÑа набоÑа ÑезÑлÑÑаÑов пÑеÑваÑÑ Ñикл 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. Также обÑаÑиÑеÑÑ Ðº РазделÑ 35.5 за дополниÑелÑнÑми ÑведениÑми о меÑÑозаполниÑелÑÑ
и вÑ
однÑÑ
паÑамеÑÑаÑ
.