DB2 9 使用开辟(733 测验)认证指南,第 1 部分: 数据库对象与编程方法(4)

应用基起原根蒂根基理构建基本
developerWorks








嵌入式 SQL 轨范

嵌入式 SQL 简介

DB2 供应了分歧的编程方法,以便开辟职员用来编写使用轨范。个中最间接的一种方法是嵌入式 SQL 编程。此编程方法很间接,这是因为轨范中嵌入了间接与 DB2 交互的 SQL 语句。可用下列随意率性一种支持的编程语言来编写轨范:

  • C/C
  • Java 语言 (SQLJ)
  • FORTRAN
  • COBOL
  • REXX


如何构造嵌入式 SQL 语句取决于所选的编程语言。C/C 和 FORTRAN 中的嵌入式 SQL 语句具有 EXEC SQL 关键字前缀:

EXEC SQL SELECT lastname,empid INTO :hostvar1, :hostvar2 
	FROM employee WHERE deptno="OPERATIONS";


COBOL 中的嵌入式 SQL 语句与 C/C 中编码的相似,然则语句的末端需加上关键字 END-EXEC

EXEC SQL SELECT lastname,empid INTO :hostvar1, :hostvar2 
           FROM employee WHERE deptno="OPERATIONS" END-EXEC;


Java 语言中的嵌入式 SQL 语句与上述两种语言中的语句稍有分歧,因为必需指定要执行该语句的跟尾上下文。下面是一个示例:

#sql [myConnCtx] {SELECT lastname, empid INTO :hostvar1, :hostvar2 
                    FROM employee WHERE deptno="OPERATIONS"};


为了更好地体味嵌入式 SQL 轨范的方法,清单 8 包括了一小段用 C 编写的轨范。在本系列的第四篇教程中(见 参考质料),将学习关于轨范预编译和理想代码开辟的更多信息。

清单 8. 一小段用 C 编写的嵌入式 SQL 轨范

                    int TbBasic(void)
{
  int rc = 0;
  struct sqlca sqlca;
  EXEC SQL BEGIN DECLARE SECTION;
    char hostVarStmt[50];
    EXEC SQL END DECLARE SECTION;
  /* declare cursor */
  EXEC SQL DECLARE c1 CURSOR FOR
    SELECT deptnumb, deptname FROM org WHERE deptnumb = 40;
  /* open cursor */
  EXEC SQL OPEN c1;
  /* fetch cursor */
  EXEC SQL FETCH c1 INTO :deptnumb, :deptname;
  while (sqlca.sqlcode != 100)
  {
    printf("    � %-14s\n", deptnumb, deptname);
    EXEC SQL FETCH c1 INTO :deptnumb, :deptname;
  }
  /* close cursor */
  EXEC SQL CLOSE c1;
  /* prepare the statement */
  strcpy(hostVarStmt, "DELETE FROM org WHERE deptnumb = 15");
  EXEC SQL PREPARE Stmt FROM :hostVarStmt;
  /* execute the statement */
  EXEC SQL EXECUTE Stmt;
  /* ROLLBACK the transaction */
  EXEC SQL ROLLBACK;
  return 0;
}







回页首



静态 SQL

刚才展现了两种分歧类型的嵌入式 SQL 语句:静态嵌入式 SQL 和静态嵌入式 SQL。

示例中使用的 SELECT 语句阐释了静态 SQL 的用法。要编写静态 SQL,必需指定完整的语句。引用的表、列的称谓以及数据类型是已知的。在运转时专一可以指定的信息是使用主机变量的 SQL 语句的 WHERE 子句中的值。

静态 SQL 语句编译(使用 DB2 术语则为筹办)后,天生数据接见方案并将其存储在数据库包中。调用包括该语句的使用轨范时,将执行此包。因为没有语句需在运转时编译,以是执行静态 SQL 时没有编译本钱。

在筹办语句时,DB2 使用数据库统计信息和设置参数来计较并获得接见方案。跟着数据库统计信息的更改,预天生的接见方案可能不如最初天生时那样理想。

使用筹办静态 SQL 语句的用户的授权来创建包和将包绑定到数据库。只需执行包的用户拥有该包的 EXECUTE 权限,该用户就无需拥有包中所引用数据库对象的显式权限。参见下面标题为 “平静思索” 的部分,体味关于 DB2 权限的更具体讨论。





回页首



静态 SQL

静态 SQL 语句在运转时静态处置。执行使用轨范时才必要晓得语句构造。

请细致:清单 8 所示的示例 SQL 语句使用静态 SQL 来 PREPAREEXECUTE 一个 DELETE 语句。DELETE 语句中的文本存储在一个主机变量 hostVarStmt 中。PREPARE 语句后,就创建了该语句的可执行方法,并将其存储于数据库包中。一旦天生数据接见方案,即可 EXECUTE 筹办后的语句。这听起来很熟悉,不是么?是的:这两个处置阶段与静态 SQL 语句险些完全一样。专一的分歧是静态 SQL 在运转时处置 PREPAREEXECUTE。而静态 SQL 在预编译时筹办接见方案并将其糊口糊口在数据库中。

静态 SQL 语句必需老是在执行前筹办,无论是不是频频使用统一语句(因而,使用统一接见方案)。为了仅可能低落这些 PREPARE 的斲丧,DB2 供应了包缓存(也称作静态盘诘缓存),用于将频仍使用接见方案糊口糊口在内存中。包缓存大大地低落了反复 SQL 筹办恳求的斲丧,但仍旧存在发出和响应筹办恳求的零碎开支。

老是在筹办语句时使用当前的数据库统计信息。因而,可天生最理想的数据接见途径。

SQL 语句的授权是在运转时决议。执行使用轨范的用户必需拥有适合的权限,用来接见语句中所引用的数据库对象。下面将学习 DB2 权限的更具体内容。





回页首



平静思索

要预编译嵌入式静态 SQL 轨范,需拥有轨范中所引用的数据库对象的显式权限。因为预编译或 PREPARE 阶段天生包并将其存储在数据库中,以是必需同时拥有 BINDADD 权限才华将新包添加到数据库中。要使用静态 SQL 执行轨范,只需拥有关系包的 EXECUTE 权限即可。

如果要编译嵌入式静态 SQL 轨范,还需拥有 BINDADD 权限。因为静态 SQL 不是在编译时筹办,以是无需拥有其他权限。轨范执行时,必需拥有发出每个 SQL 语句必需的统统权限,并对为嵌入式 SQL 轨范所创建的包,拥有 EXECUTE 权限。

表 1 总结了预编译和执行只使用静态或纯静态 SQL 语句的轨范所需的权限:

表 1. 预编译和执行轨范所需的权限
角色 静态 SQL 所需的权限 静态 SQL 所需的权限
开辟职员(预编译轨范) BINDADD 权限用于向数据库中添加新包;数据库对象的显式权限 BINDADD 权限用于向数据库中添加新包
使用轨范用户(执行轨范) EXECUTE 权限用于执行轨范关系的包 数据库对象的显式权限;EXECUTE 权限用于执行轨范关系的包






回页首



静态 SQL 与静态 SQL 相比

下面在表 2 中总结并扩展所体味的静态和静态 SQL 常识:

表 2. 静态 SQL 与静态 SQL 相比
静态 SQL 静态 SQL
SQL 语句的构造是已知的。对列、表和数据类型的引用必需明晰指定。变量只能用作语句的 WHERE 子句中的搜刮值。 预编译时无需晓得语句构造。语句文本本身可存储在使用轨范执行期间引用的一个变量中。这就供应了支持轨范的机动性,因为在使用轨范筹划时并不晓得语句的终极方法。
在预编译时天生数据接见方案。包在数据库中是持久的,而且可重用。如果只是偶然运转语句,则与静态 SQL 相比,静态 SQL 可能供应更好的运转时功能。 在运转时天生数据接见方案。存储在内存中称为包缓存 的地位。如果频频执行统一语句,则可重用 PREPARE 阶段在内存中天生的数据接见方案。因而,静态 SQL 的功能不必然比静态 SQL 差。然则,首次实举静态 SQL 时必需蒙受 PREPARE 阶段的统统本钱。
预编译时的数据库统计信息和设置参数用于天生理想的数据接见方案。 运转时的数据库统计信息和设置参数用于天生理想的数据接见方案 如果必要频仍地执行 RUNSTATS,则静态 SQL 可应用最新、最佳的数据库统计信息。
预编译时验证授权。开辟职员要预编译包括静态 SQL 的轨范,必需拥有接见语句中所引用的对象的适合授权和权限。创建包之后,执行包的用户必需拥有包的 EXECUTE 权限。 运转时验证授权。用户若要执行包括静态 SQL 的轨范,必需对语句中所引用的对象拥有适合授权和权限。





版权声明: 原创作品,答理转载,转载时请务必以超链接方法标明文章 原始出处 、作者信息和本声明。否则将究查法令责任。

posted @ 2011-03-06 23:52  蓝色的天空III  阅读(116)  评论(0编辑  收藏  举报