On this page
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;
Inserting rows:
EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad');
EXEC SQL COMMIT;
Deleting rows:
EXEC SQL DELETE FROM foo WHERE number = 9999;
EXEC SQL COMMIT;
Updates:
EXEC SQL UPDATE foo
SET ascii = 'foobar'
WHERE number = 9999;
EXEC SQL COMMIT;
返回单个结果行的SELECT
语句也可以直接使用EXEC SQL
执行。要处理具有多行的结果集,应用程序必须使用游标。请参阅下面的Section 35.3.2。 (作为一种特殊情况,应用程序可以一次将多个行提取到数组主机变量中;请参阅Section 35.4.4.3.1。)
Single-row select:
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
另外,可以使用SHOW
命令检索配置参数:
EXEC SQL SHOW search_path INTO :var;
:something
形式的标记是主机变量,即它们引用 C 程序中的变量。它们在Section 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
命令详细信息请参见FETCH。
Note
ECPG DECLARE
命令实际上并不会导致将语句发送到 PostgreSQL 后端。在执行OPEN
命令时,将在后端(使用后端的DECLARE
命令)中打开光标。
35 .3.3. ManagementTransaction
在默认模式下,仅在发出EXEC SQL COMMIT
时提交语句。嵌入式 SQL 接口还通过ecpg
的-t
命令行选项(请参见ecpg)或EXEC SQL SET AUTOCOMMIT TO ON
语句支持事务的自动提交(类似于 psql 的默认行为)。在自动提交模式下,每个命令都将自动提交,除非它在显式事务块内。可以使用EXEC SQL SET AUTOCOMMIT TO OFF
显式关闭此模式。
以下事务 Management 命令可用:
EXEC SQL COMMIT
- 提交正在进行的 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
- 启用自动提交模式。
EXEC SQL SET AUTOCOMMIT TO OFF
- 禁用自动提交模式。这是默认值。
35 .3.4. 准备的 Statements
如果在编译时不知道要传递给 SQL 语句的值,或者将多次使用同一条语句,则准备好的语句可能会很有用。
使用命令PREPARE
准备该语句。对于尚不知道的值,请使用占位符“ ?
”:
EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";
如果一条语句返回一行,则应用程序可以在PREPARE
之后调用EXECUTE
来执行该语句,并为占位符提供USING
子句的实际值:
EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;
如果一条语句返回多行,则应用程序可以使用基于准备好的语句声明的游标。要绑定 Importing 参数,必须使用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 35.5,以获取有关使用占位符和 Importing 参数的更多详细信息。