Postgresql 中文操作指南
36.3. Running SQL Commands #
可以在嵌入式 SQL 应用程序内运行任何 SQL 命令。以下是一些如何执行此操作的示例。
36.3.1. Executing SQL Statements #
创建表:
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_直接执行。若要处理具有多行的结果集,应用程序必须使用游标;请参见下文的 Section 36.3.2。(作为特殊情况,应用程序可以一次将多行获取到数组宿主变量中;请参见 Section 36.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 程序中的变量。它们在 Section 36.4 中进行了解释。
36.3.2. Using Cursors #
若要检索包含多行的结果集,应用程序必须声明一个游标并从游标中获取每一行。使用游标的步骤如下:声明一个游标,打开它,从游标中获取一行,重复,最后关闭它。
使用游标进行选择:
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;
36.3.3. Managing Transactions #
在默认模式下,只有当发出 EXEC SQL COMMIT 时才提交语句。嵌入式 SQL 界面也通过 -t 命令行选项 ecpg (请参阅 ecpg )或 EXEC SQL SET AUTOCOMMIT TO ON 语句来支持自动提交事务(类似于 psql 的默认行为)。在自动提交模式下,每个命令自动提交,除非它在显式事务块内。可以通过 EXEC SQL SET AUTOCOMMIT TO OFF 明确关闭此模式。
可以使用以下事务管理命令:
-
EXEC SQL COMMIT #
-
Commit an in-progress transaction.
-
-
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 #
-
Enable autocommit mode.
-
-
EXEC SQL SET AUTOCOMMIT TO OFF #
-
禁用自动提交模式。这是默认设置。
-
36.3.4. Prepared Statements #
当要传递给 SQL 语句的值在编译时未知,或者同一个语句将被多次使用时,准备好的语句很有用。
使用命令 EXEC SQL SET AUTOCOMMIT TO OFF 准备语句。对于尚未知道的值,请使用占位符 “PREPARE”:
EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";
如果一个语句返回单行,应用程序可以在 ? 之后调用 EXECUTE 以执行语句,通过 PREPARE 子句为占位符提供实际值:
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。有关使用占位符和输入参数的更多详细信息,还请参见 Section 36.5。