mysql 嵌入式SQL的步骤理解问题,我要一个具体的例子

f1tvaqid  于 2023-03-28  发布在  Mysql
关注(0)|答案(1)|浏览(177)

演讲幻灯片

你能提供一个具体的例子来说明将主机语言+嵌入式SQL转换为主机语言对象代码的两个步骤吗?这两个步骤是在预处理器步骤之后进行的?作为一名最后一年注册数据库系统课程的统计学专业的学生,我对所附的讲座幻灯片中概述的过程感到有点困惑,并希望得到一些澄清。这门课需要比我想象的更多的计算背景知识。
我知道主机语言是我们正在使用的语言,例如,它可能是Python,C,Java,C++。我阅读了幻灯片和教科书,并在网上搜索了youtube视频。然而,没有专业背景,我有点难以将所有点连接在一起。

mrfwxfqh

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许可证摘录):

#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;  
}

你可以看到,这基本上看起来像C代码,但有许多行,前缀为EXEC SQL,这是代码的一部分。它们不是像今天大多数SQL使用的字符串。
在开发过程中,在编译代码之前,您必须运行某种预处理器工具。预处理器以主机语言(上面的示例中为C)输出代码,准备编译。EXEC SQL语句将被解析并替换为一系列提交查询和获取结果的低级API调用。
嵌入式SQL的一个优点是,所有SQL语句都是在编译之前解析的,而不是在运行时解析的,因此它不可能受到SQL注入的攻击。
嵌入式SQL的一个缺点是,由于查询在编译时是固定的,因此在不重新编译应用程序的情况下无法对其进行更改。例如,如果WHERE子句中的项数可变,或者试图执行数据透视表查询,则无法使用嵌入式SQL执行。必须使用动态SQL准备查询。
有几个开源RDBMS产品支持嵌入式SQL:

  • PostgreSQL支持C代码中的嵌入式SQL。有关如何在PostgreSQL中使用嵌入式SQL的信息,请参阅PostgreSQL: Documentation: 9.5: ECPG
  • Firebird支持C、C++、Ada、Fortran、Cobol和Pascal中的嵌入式SQL。有关详细信息,请参阅Firebird应用程序开发及其嵌入式SQL的PDF文档链接。
  • MySQL目前不支持嵌入式SQL预编译器。我想我记得它在过去的某个时候做过,但我找不到它的引用。我确实找到了一篇关于awk中实现的MySQL嵌入式SQL预编译器的文章:http://download.nust.na/pub6/mysql/tech-resources/articles/precompiler-for-embedded-sql.html但是我不知道它现在有多流行,或者它是不是废弃软件,它不是官方MySQL产品的一部分。

相关问题