#include <stdio.h>
EXEC SQL BEGIN DECLARE SECTION;
int x;
int x_indicator;
EXEC SQL END DECLARE SECTION;
int i;
void main () {
EXEC SQL CONNECT TO database_or_server USER Josephine;
EXEC SQL DECLARE example_cursor CURSOR FOR SELECT col_1 FROM T;
EXEC SQL OPEN example_cursor;
for (i=0; i<10; ++i) {
EXEC SQL FETCH example_cursor INTO :x INDICATOR :x_indicator;
if (x_indicator < 0) printf("?\n");
else printf("%d\n",x);
}
EXEC SQL CLOSE example_cursor;
EXEC SQL DISCONNECT database_or_server;
}
1条答案
按热度按时间mrfwxfqh1#
我很少看到软件开发人员在新的应用程序中使用嵌入式SQL。你可能永远不会遇到嵌入式SQL。它是20世纪80年代和90年代的产物。从技术上讲,它仍然是ANSI SQL标准的一部分,但我很惊讶任何讲座都涉及它。
现在几乎所有的SQL使用都是动态SQL,将SQL放入字符串变量中,并使用API将其作为字符串发送到RDBMS服务器。RDBMS服务器在运行时解析它。这是大多数SQL API的工作方式,例如JDBC,ODBC或PHP中的各种数据库扩展。即使当您使用ORM库时,ORM代码也会将SQL形成字符串,并将这些字符串发送到RDBMS以在执行查询之前进行解析。
嵌入式SQL使SQL看起来像是编程语言的一部分,而不是字符串变量。您可以有效地获得新的语法来查询和获取结果,因此您的代码是用某种增强的编程语言编写的。
以下是在线书籍SQL-99 Complete, Really中的一个嵌入式SQL示例(根据Creative Commons BY-SA 3.0许可证摘录):
你可以看到,这基本上看起来像C代码,但有许多行,前缀为EXEC SQL,这是代码的一部分。它们不是像今天大多数SQL使用的字符串。
在开发过程中,在编译代码之前,您必须运行某种预处理器工具。预处理器以主机语言(上面的示例中为C)输出代码,准备编译。
EXEC SQL
语句将被解析并替换为一系列提交查询和获取结果的低级API调用。嵌入式SQL的一个优点是,所有SQL语句都是在编译之前解析的,而不是在运行时解析的,因此它不可能受到SQL注入的攻击。
嵌入式SQL的一个缺点是,由于查询在编译时是固定的,因此在不重新编译应用程序的情况下无法对其进行更改。例如,如果WHERE子句中的项数可变,或者试图执行数据透视表查询,则无法使用嵌入式SQL执行。必须使用动态SQL准备查询。
有几个开源RDBMS产品支持嵌入式SQL:
awk
中实现的MySQL嵌入式SQL预编译器的文章:http://download.nust.na/pub6/mysql/tech-resources/articles/precompiler-for-embedded-sql.html但是我不知道它现在有多流行,或者它是不是废弃软件,它不是官方MySQL产品的一部分。