Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158056
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-23 15:21
文章分类

全部博文(66)

文章存档

2016年(66)

我的朋友

分类: LINUX

2016-05-06 15:25:59

动态SQL

    在实际工作中,有时我们需要在运行应用程序时接收和处理不同的SQL语句,比如在该程序的功能函数中需要不同的select语句。因为这些SQL语是在程序运行时动态输入的,所以成为动态SQL语句。


动态SQL与静态SQL语句比较:

·静态SQL语句被内嵌到了源程序中,而动态SQL语句则是在应用程序运行时所输入的SQL语句,它被存储到了字符串变量中。因此使用动态SQL比静态SQL更灵活。

·使用动态SQL需要编写更加复杂的代码,而使用静态SQL只需将SQL语句内嵌到应用程序中就可以了。

·如果能够能够确定应用程序所要使用的SQL语句和它的结构,那么使用静态SQL,因为这样不仅可以简化编程,而且应用程序的执行性能更好;而如果不能确定要执行何种SQL语句、宿主变量个数,宿主变量数据类型以及SQL语句所涉及到的数据对象,那么就要使用动态SQL。这样可使应用程序更加灵活,但程序编制更加复杂。




在Pro*C/C++应用程序中使用动态SQL共有四种方法:

·动态SQL方法一:适用于不包含宿主变量的SQL语句,并且不能是SELECT语句。

·动态SQL方法二:适用于宿主变量个数已经确定的SQL语句,并且不能是SELECT语句。

·动态SQL方法三:适用于查询列表已经确定的SQL语句。

·动态SQL方法四:适用于查询列表以及宿主变量个数均不能确定的SQL语句



************************************
动态SQL方法三:

本方法与动态SQL方法二比较类似。不同的是,方法三将PREPARE命令与游标命令结合起来使用。因此,本方法可以接收和处理SELECT语句。但在预编译时,必须要知道查询列表项的列数以及占位符的个数。数据库对象名(例如:表名和列名)可以在运行时指定,但数据库对象名不能是宿主变量。另外,也可以在运行时指定条件、分组以及排序子句。


使用动态SQL方法三的步骤如下:


1)使用PREPARE命令准备SQL语句

该命令用于命名和分析SQL语句。在分析了SQL语句后,可以使用EXECUTE语句多次执行该语句。PREPARE命令的语法如下:

EXEC SQL PREPARE statement_name FROM{:host_string|string_literal};

参数说明如下:

·statement_name:语句名称,它是一个标识符而不是宿主变量。

·host_string:包含了SQL语句的宿主变量。

·string_literal:包含了SQL语句的字符串。



2) 使用DECLARE命令定义游标

该命令语法如下:

DECLARE cursor_name CURSOR FORstatement_name;

参数说明如下:

·cursor_name:游标名。

·statement_name:步骤1中的SQL语句标识符。



3) 使用OPEN命令打开游标

该命令的语法如下:

OPEN cursor_name [USING host_variable_list] ;

参数说明如下:

·cursor_name:步骤2中的游标名。

·host_variable_list:宿主变量列表,使用该列表中的项替换SQL语句中的占位符。

需要注意的是,如果SQL语句不是SELECT语句,那么在执行了OPEN命令后即完成了SQL语句的执行,而无需执行FETCH语句。



4) 使用FETCH语句推进游标、检索数据

该语句的语法如下:

FETCH cursor_name INTO host_variable_list;

参数说明如下:

cursor_name:游标名。

host_variable_list:宿主变量名列表,将检索到的数据保存到这些宿主变量中。



5) 使用CLOSE命令关闭游标

该命令语法如下:

CLOSE cursor_name;
阅读(1401) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~