在很多情况中,一个应用必须要执行的特定 SQL 语句在编写该应用时就已知。不过在某些情况中,SQL 语句在运行时构造或者由一个外部来源提供。这样你就不能直接把 SQL 语句嵌入到 C 源代码,不过有一种功能允许你调用在一个字符串变量中提供的任意 SQL 语句。
执行一个任意 SQL 语句的最简单方法是使用命令EXECUTE IMMEDIATE
。例如:
EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "CREATE TABLE test1 (...);";
EXEC SQL END DECLARE SECTION;
EXEC SQL EXECUTE IMMEDIATE :stmt;
EXECUTE IMMEDIATE
可以被用于不返回结果集的 SQL 语句(例如 DDL、INSERT
、UPDATE
、DELETE
)。你不能用这种方法执行检索数据的语句(例如SELECT
)。下一节将描述如何执行这一种语句。
执行任意 SQL 语句的一种更强大的方法是准备它们一次并且在每次需要时执行该预备语句。也可以准备一个一般化的语句,然后通过替换参数执行它的特定版本。在准备语句时,在你想要稍后替换参数的地方写上问号。例如:
EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "INSERT INTO test1 VALUES(?, ?);";
EXEC SQL END DECLARE SECTION;
EXEC SQL PREPARE mystmt FROM :stmt;
...
EXEC SQL EXECUTE mystmt USING 42, "foobar";
当你不再需要预备语句时,你应该释放它:
EXEC SQL DEALLOCATE PREPARE name
;
要执行一个只有单一结果行的 SQL 语句,可以使用EXECUTE
。要保存结果,在其中增加一个INTO
子句。
EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "SELECT a, b, c FROM test1 WHERE a > ?";
int v1, v2;
VARCHAR v3[50];
EXEC SQL END DECLARE SECTION;
EXEC SQL PREPARE mystmt FROM :stmt;
...
EXEC SQL EXECUTE mystmt INTO :v1, :v2, :v3 USING 37;
一个EXECUTE
命令可以有一个INTO
子句、一个USING
子句,可以同时有这两个子句,也可以不带这两个子句。
如果一个查询被期望返回多于一个结果行,应该如下列例子所示使用一个游标(关于游标详见第 35.3.2 节)。
EXEC SQL BEGIN DECLARE SECTION;
char dbaname[128];
char datname[128];
char *stmt = "SELECT u.usename as dbaname, d.datname "
" FROM pg_database d, pg_user u "
" WHERE d.datdba = u.usesysid";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO testdb AS con1 USER testuser;
EXEC SQL SELECT pg_catalog.set_config("search_path", "", false); EXEC SQL COMMIT;
EXEC SQL PREPARE stmt1 FROM :stmt;
EXEC SQL DECLARE cursor1 CURSOR FOR stmt1;
EXEC SQL OPEN cursor1;
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while (1)
{
EXEC SQL FETCH cursor1 INTO :dbaname,:datname;
printf("dbaname=%s, datname=%sn", dbaname, datname);
}
EXEC SQL CLOSE cursor1;
EXEC SQL COMMIT;
EXEC SQL DISCONNECT ALL;
35.13.1. 主变量的可见范围35.13.2. 使用外部 C 模块的 C++ 应用开发ECPG 对于 C++ 应用提供了有限的支持。这一节描述了一些忠告...
EXECUTE IMMEDIATE — 动态地准备和执行一个语句大纲EXECUTE IMMEDIATE string描述 EXECUTE IMMEDIATE立刻预备并且执行一个动态...
Input Button name 属性 Button 对象定义和用法name 属性可设置或者返回 button 元素的 name 属性值。name 属性用于表单提交后向...
Form acceptCharset 属性 Form 对象定义和用法acceptCharset 属性可设置或返回一个逗号分隔的列表,内容是服务器可接受的字符集...
Form action 属性 Form 对象定义和用法action 属性可设置或返回表单的 action 属性。action 属性定义了当表单被提交时数据被送往...
Progress max 属性 Progress 对象实例修改进度条的最大值:document.getElementById("myProgress").max="50";定义和用法max 属性...
Style alignSelf 属性 Style 对象实例居中对齐灵活元素内的某个项目:document.getElementById("myDIV").style.alignSelf="cente...
Style borderBottomStyle 属性 Style 对象定义和用法borderBottomStyle 属性设置或返回元素的下边框的样式。语法设置 borderBott...
Style borderBottomWidth 属性 Style 对象定义和用法borderBottomWidth 属性设置或返回元素的下边框的宽度。语法设置 borderBott...