ecpg-commands.md 4.6 KB
Newer Older
李少辉-开发者's avatar
李少辉-开发者 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 36.3.运行SQL命令

[36.3.1. 执行SQL语句](ecpg-commands.html#ECPG-EXECUTING)

[36.3.2. 使用游标](ecpg-commands.html#ECPG-CURSORS)

[36.3.3. 管理交易](ecpg-commands.html#ECPG-TRANSACTIONS)

[36.3.4. 准备好的声明](ecpg-commands.html#ECPG-PREPARED)

任何SQL命令都可以在嵌入式SQL应用程序中运行。下面是一些如何做到这一点的例子。

### 36.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;
```

`选择`返回单个结果行的语句也可以使用`执行SQL`直接地要处理多行的结果集,应用程序必须使用游标;看见[第36.3.2节](ecpg-commands.html#ECPG-CURSORS)在下面(作为一种特殊情况,应用程序可以一次将多行提取到数组主机变量中;请参阅。)[第36.4.4.3.1节](ecpg-variables.html#ECPG-VARIABLES-ARRAYS).)

单行选择:

```
EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';
```

此外,还可以使用`显示`命令:

```
EXEC SQL SHOW search_path INTO :var;
```

形式的象征`:*`某物`*`*宿主变量*也就是说,它们指的是C程序中的变量。这些问题在本文中有详细的解释[第36.4节](ecpg-variables.html).

### 36.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;
```

有关声明游标的更多详细信息,请参阅[声明](ecpg-sql-declare.html); 有关从光标获取行的更多详细信息,请参阅[取来](sql-fetch.html).

### 笔记

ECPG`声明`命令实际上不会导致将语句发送到PostgreSQL后端。光标在后端打开(使用后端的`声明`命令)在`打开`命令被执行。

### 36.3.3.管理交易

在默认模式下,只有在`执行SQL提交`已发布。嵌入式SQL接口还支持通过自动提交事务(类似于psql的默认行为)`-t`命令行选项`ecpg`(见[ecpg](app-ecpg.html))或者通过`EXEC SQL将自动提交设置为打开`陈述在自动提交模式下,每个命令都会自动提交,除非它位于显式事务块内。可以使用以下命令显式关闭此模式:`EXEC SQL将自动提交设置为关闭`.

以下事务管理命令可用:

`执行SQL提交`

提交正在进行的事务。

`执行SQL回滚`

回滚正在进行的事务。

`EXEC SQL准备事务`*`交易id`*

为两阶段提交准备当前事务。

`EXEC SQL提交已准备就绪`*`交易id`*

提交处于准备状态的事务。

`EXEC SQL回滚已准备就绪`*`交易id`*

回滚处于准备状态的事务。

`EXEC SQL将自动提交设置为打开`

启用自动提交模式。

`EXEC SQL将自动提交设置为关闭`

禁用自动提交模式。这是默认设置。

### 36.3.4.准备好的声明

当要传递给SQL语句的值在编译时是未知的,或者同一语句将被多次使用时,准备好的语句可能会很有用。

该语句是使用命令准备的`准备`.对于未知的值,请使用占位符“`?`”:

```
EXEC SQL PREPARE stmt1 FROM "SELECT oid, datname FROM pg_database WHERE oid = ?";
```

如果语句返回一行,应用程序可以调用`处决`之后`准备`要执行该语句,请使用`使用`条款:

```
EXEC SQL EXECUTE stmt1 INTO :dboid, :dbname USING 1;
```

如果语句返回多行,应用程序可以使用基于准备好的语句声明的游标。要绑定输入参数,必须使用`使用`条款:

```
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;
```

更多关于`准备`看见[准备](ecpg-sql-prepare.html).另见[第36.5节](ecpg-dynamic.html)有关使用占位符和输入参数的详细信息。