`
m635674608
  • 浏览: 5029455 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

pro*c 动态sql

 
阅读更多
动态SQL
在有些情况下, 在编码时SQL语句还不能完整地写出来, 而是在程序执行时才能构造出来(也就是说动态SQL语句在程序编译时语句的选择列表和确定, 变量数据大于0)。 这种在程序执行临时生成的SQL语句叫动态SQL语句. 利用动态SQL来编写Pro*C程序的方法叫动态SQL技术.
在下列情况之一不知道时, 使用动态SQL技术:
a. SQL语句的文本.
b. 宿主变量的个数。
c. 宿主变量的数据类型。
Oracle Pro*C 编程入门
d. 引用的数据库对象, 如列, 索引, 序列, 表, 用户名和视图.
实际上, 动态SQL在一般应用中用的相当普遍!
Oracle中动态SQL可用以下两种方法实现:
一个是Oracle自己的方法, 一个是ANSI的方法. 一般建议使用Oracle的方法,但对于较复杂的应用, 可以使用ANSI的方法, 因为这样可以使自己的程序简化。
下面先说Oracle自己的方法.
5.1 Oracle方法
一般来说, 应该使用一个字符串变量来表示动态SQL语句的文本。 但该文本不包含“EXEC SQL”和分号“;”以及下列嵌入式SQL命令:
ALLOCATE CLOSE DECLARE DESCRIBE
EXECUTE FETCH FREE GET
INCLUDE OPEN PREPARE SET
WHENEVER
5.1.1 动态SQL语句的处理过程
动态SQL语句的处理过程如下:
a. 构造动态SQL语句, 提示用户输入和构造一个动态SQL语句文本。
b. 分析该语句: Oracle对动态SQL语句文本进行语法检查, 并检查动态SQL语句所参照的数据库对象是否存在, 以及用户是否具有访问它所参照的对象的权限。
c. 为SQL语句结合宿主变量:在执行语句过程中, Oracle读取宿主变量地址, 并从这些变量中读取数据, 式将数据写入这此变量中。
d. 执行SQL语句, 实现数据库操作。
5.1.2 Oracle使用动态SQL的四种方法
Oracle提供了四种处理动态SQL的方法, 这四种方法从一到四依次变得复杂,从功能上说也是依次包含关系, 即前一种方法的功能可以完全由后一种方法实现。 用户可以根据每个任务的难易程度选择一种适合于自己的方法。
有关这四种方法的详细介绍请参考相关手册和DEMO程序.
a. 方法一
这种方法只能执行非查询语句, 且在非查询动态SQL语句内不能包含输入宿主变量占位符。
这种方法使用EXECUTE IMMEDIATE命令立即执行动态SQL语句, 所以在每次执行时, Oracle需要对语句进行重新解释。
如:
…
<连接数据库>
strcpy(str_sql,“DELETE FROM test001 WHERE name=’username’”);
Oracle Pro*C 编程入门
EXEC SQL EXECUTE IMMEDIATE :str_sql;
…
b. 方法二
这种方法也只能用于执行非查询语句, 并且允许非查询动态SQL语句内包含输入宿主变量占位符, 但它要求在预编译时刻动态SQL语句内的占位符数量及输入宿主变量的数据类型必须确定。
①. 准备阶段: 调用PREPARE语句准备需要执行的动态SQL语句, 这时Oracle对动态SQL语句进行语法分析, 检查它所参照的数据库对象等;
②. 执行阶段: 调用EXECUTE 命令执行准备好的动态SQL语句。
采用这种方式时, 动态SQL被准备好后可以被多次执行, 而不需要Oracle在
每次执行时重新解释SQL语句。
如:
…
<连接数据库>
strcpy(str_sql,“INSERT INTO test001 values (:K1,:K2,:K3)”);
EXEC SQL PREPARE test FROM :str_sql;
EXEC SQL EXECUTE test USING :uname, :uaddress,:usex;
…
占位符可以是随便给的一个字符, 单词等.它只起占位作用而没有实际意义.
c. 方法三
这种方法可以执行包括查询语句在内的动态SQL语句, 但它要求在预编译时刻动态SQL语句内选择列表项数,输入宿主变量占位符数据以及输入宿主变量的数据类型必须确定。 方法三以游标方式执行动态SQL语句, 它对SQL语句的处理过程为:
①. 准执行PREPARE命令准备SQL语句;
#实际就是把要执行的动态语句调入内存, 以
便以后对它进行操作。
②. 执行DECLARE命令声明游标;
③. 执行OPEN打开游标;
④. 调用FETCH语句提取游标;
⑤. 调用CLOSE语句关闭游标。
动态SQL语句中的数据库对象名称和列名可以在运行时刻指定, 便此时不能以宿主变量形式指定对象名称或列名.
其实就是多了一个游标的使用。
如下面程序:
<连接数据库>;
strcpy(sql_stmt, "SELECT name, address, sex FROM test001");
EXEC SQL PREPARE select_stmt FROM :sql_stmt;
EXEC SQL DECLARE c1 CURSOR FOR select_stmt;
EXEC SQL OPEN c1;
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while(1)
Oracle Pro*C 编程入门
{
EXEC SQL FETCH c1 INTO :Name, :address, :sex;
printf("The name is: %s, The Address is: %s, The sex is :%s\n", Name, address,
sex);
}
EXEC SQL CLOSE c1;
d. 方法四
使用描述符方式处理动态SQL语句,它可以执行包括查询语句在内的所有动态SQL语句。 这种方式对动态SQL语句的限制最小, 它不要求在预编译时确定动动态SQL语句内的选择列表项数,库占位符数量以及宿主变量数据类型, 这些元素只要在运行时刻能够确定即可。
也就是说这种方法适合于在程序编译时对程序中的SQL语句还一无所知的情况。
方法四通过使用SQLDA结构代替宿主变量, 并通过调用DESCRIBE SELECT LIST或DESCRIBE BIND VARIABLES语句来检索选择列表项和结合变量(即宿主变量)描述信息, 从而使应用程序能够在运行时刻处理这种类型的动态SQL语句。
当SQLDA结构用于存列表信息项信息时, 它们被称做查询描述符; 当SQLDA结构用于存储结合变量信息时, 它们被称作结合描述符。
SQLDA结构的详细信息较长, 请参考相关书籍或手册。
这三种方法中前三种比较简单, 这里就不多说了, 方法四最为灵活, 功能最全,
但是也最为复杂. 使用方法共可分为以下18个步骤(请参考以下18个步骤去看例
程):
⑴. 在宿主变量声明区域声明字符串型宿主变量, 用它存储动态语句文本。
⑵. 声明查询和结合描述符。
⑶. 为查询和结合描述符分配内存空间;
⑷. 设置描述符能够最多描述的选择列表项和占位符数量;
⑸. 将动态语句文本拷贝到前面声明的宿主变量字符串中;
⑹. 调用PREPARE语句准备宿主变量字符串中的动态语句;
⑺. 为查询语句声明游标;
⑻. 描述结合变量,填充结合描述符;
⑼. 用DESCRIBE 语句所检索到的占位符实际数据(F)设置结合描述符中的占位符数据量, 即N元素;
⑽. 为DESCRIBE语句所检索到的结合变量分配内存, 并为各个结合变量提供数值;
⑾. 使用结合描述符打开游标;
⑿. 描述选择列表, 填充查询描述符;
⒀. 将查询描述符中的选择列表项数值设为DESCRIBE 语句所检索到的动态SQL语句中的实际选择列表项数;
⒁. 重新设置选择列有项的长度和数据类型;
⒂. 执行FETCH语句, 将数据库表中的数据提取到查询描述符所指向的数据缓冲区中;
⒃. 处理FETCH语句返回的选择列值;
⒄. 释放应用程序为选择列, 占位符, 指示符变量和描述符所申请的内存空
Oracle Pro*C 编程入门

5.2 ANSI方法
ANSI的方法如下:
5.2.1 使用ANSI方法的一些注意事项
Pro*C 应用程序的使用ANSI处理方法时, 必须将DYNAMIC 预编译选项值设置为
ANSI。 此外, 还需将TYPE_CODE选项设为ANSI。(这一点要十分注意, 因为这两
个选项不加会出现意想不到的错误,比如说: 如果不加TYPE_CODE, 程序一样可以
编译通过, 但是执行的结果却和你原来的的想法大相径庭)
5.2.2 ANSI方法和Oracle方法的不同
ANSI方法和Oracle方法相比有以下不同:
①. Oracle处理方法不支持对象类型, 游标变量, 结构数组, DML语句的RETURNING子句, 多字节字符变量
和LOB等,而ANSI处理方法支持所有的Oracle数据类型。
②. ANSI处理方法所使用的描述符为C/C++结构变量, 它们由应用程序申请,释放和维护,而ANSI处理方法所使用的描述符则为SQL描述符, 它们由Oracle内部维护。
正是由于ANSI方法所使用的描述符是由Oracle内部维护, 所以ANSI方法比以上
方法四少了一些对于描述符的操作,
比如分配内存空间等。
5.2.3 ANSI处理方法对动态SQL语句的处理步骤
ANSI处理方法对动态SQL语句的处理步骤为:
⑴. 声明宿主变量, 包括动态SQL语句存储缓冲区;
⑵. 为输入,输出变量分配描述符;
⑶. 将动态语句文本拷贝到前面(1)中声明的宿主变量字符串中;
⑷. 调用PREPARE语句准备宿主变量字符串中的动态语句;
#这一步实际上是对SQL语句进行语法分析, 检查
它所参照的数据库对象。
⑸. 用DESCRIBE语句描述输入操作;
#目的是读取动态SQL语句中的输入变量和输出变量等
描述信息,将它们存储到指定的输入描述符和输出描
述符中。
⑹. 声明动态游标;
⑺. 用SET DESCRIPTOR 语句设置输出描述符;
Oracle Pro*C 编程入门
⑻. 打开游标;
⑼. 提取游标数据;
⑽. 处理所提取的游标数据;
⑾. 关闭游标;
⑿. 释放输入,输出描述符;

注意: 如果用ANSI方法处理非查询语句时, 就没必要申请输出描述符!以上所列的
步骤可根据各自的应用进行增删!
比如说, 像没有参数的delete, insert等语句的处理就可以简化为以下四步:
a. 准备语句;
b. 声明游标;
c. 打开游标。
d. 关闭游标;

 

分享到:
评论

相关推荐

    Pro * c的动态SQL方法在仿真系统中的应用.pdf

    Pro*C是一种基于C语言的嵌入式SQL语言,能够将SQL语句嵌入到C语言程序中,从而实现数据库操作。Pro*C的动态SQL方法是指在Pro*C程序中使用动态定义的SQL语句来实现数据库操作。这种方法可以根据不同的数据库和应用...

    Pro*c编程电子图书

    1. **高级Pro*C特性**:深入讲解Pro*C的高级特性,如动态SQL、批处理、并发控制等。 2. **性能优化**:介绍如何通过Pro*C优化数据库访问,包括索引策略、查询优化和内存管理。 3. **分布式处理**:探讨如何在Pro*C中...

    oracle培训pro*c

    Oracle Pro*C 是一种集成的开发工具,用于在C语言中嵌入SQL语句,以便高效地与Oracle数据库进行交互。这种技术将C语言的强大功能与SQL的数据库操作能力结合在一起,提供了一种灵活且高性能的方式来构建数据库应用...

    Oracle Pro*C 编程入门.pdf

    1. Pro*C简介:Pro*C是一种将SQL语句嵌入C程序中的开发工具,它允许开发者在C语言中直接使用SQL语句访问Oracle数据库。它是一种第三代语言嵌入式SQL工具,可以在Oracle数据库管理系统中使用。Pro*C程序可以执行...

    pro*c学习资料

    PRO*C为开发者提供了一种将SQL语句嵌入C语言程序的有效方式,使得开发者可以在保持C语言强大逻辑处理能力的同时,充分利用SQL语言进行高效的数据管理。通过了解PRO*C的基本概念、程序结构以及如何使用SQL语句,...

    《精通Oracle 10g Pro*C/C++编程》源代码与学习笔记

    8. **动态SQL**:在Pro*C中,可以使用字符串拼接或者EXEC SQL EXECUTE IMMEDIATE语句执行动态SQL,这在处理灵活的查询需求时非常有用。 9. **存储过程和函数**:学习如何在C/C++中调用Oracle的存储过程和函数,以及...

    pro*c sample

    Pro*C是Oracle公司开发的一种预编译器,它允许程序员在C语言中嵌入PL/SQL代码,使得C程序可以直接与Oracle数据库交互。通过Pro*C,开发者可以利用C语言的强大功能和效率,同时享受Oracle数据库提供的高级数据库操作...

    linux下c/c++连oracle数据库技术pro*c

    Pro*C是Oracle客户端工具集的一部分,它将PL/SQL块转换为C/C++函数,使得开发者可以在C或C++程序中直接执行Oracle数据库的SQL和PL/SQL语句。这不仅提高了开发效率,也提供了更好的性能,因为数据库调用可以被优化。...

    Pro*C程序设计ORACLE调用接口

    - **动态SQL**:允许在运行时构造和执行SQL语句,增强了程序的灵活性。 - **嵌入式PL/SQL**:除了SQL,还可以嵌入PL/SQL块,方便处理复杂的业务逻辑。 - **绑定变量**:使用绑定变量可以减少SQL注入的风险,并...

    精通PRO*c编程

    PRO*C是Oracle Corporation为C程序员设计的一种工具,它允许在C程序中嵌入SQL语句,使得C语言能够与Oracle数据库无缝集成。 一、PRO*C简介 PRO*C是Oracle数据库的C语言接口,它扩展了C语言,增加了对SQL和PL/SQL的...

    使用Pro*C/C++ 开发嵌入式SQL程序

    7. **游标和动态SQL**:Pro*C/C++支持游标,可以用来遍历查询结果,也可以用于执行动态SQL。动态SQL允许在运行时构建SQL语句,增加了程序的灵活性。 8. **事务管理**:使用`EXEC SQL BEGIN WORK`、`EXEC SQL COMMIT...

    Pro*C/C++ 编程

    Pro*C/C++ 是一种集成在C或C++编程语言中的预处理器,它允许程序员直接在源代码中嵌入PL/SQL语句,用于与Oracle数据库进行交互。这种编程方式提供了高效且灵活的数据库访问手段,特别适合于开发与Oracle数据库紧密...

    PRO*C入门实例

    在IT领域,PRO*C是Oracle公司提供的一种预编译器,它允许开发人员使用C语言来编写PL/SQL代码,从而更高效地与Oracle数据库进行交互。这个“PRO*C入门实例”可能是针对初学者的一个教程,通过一个实际的代码示例来...

    java 调 pro*c

    - **动态链接库/静态库**:Java通过JNI调用的C代码需要打包成库文件,不同操作系统有不同格式的库文件,如Linux的`.so`和Windows的`.dll`。 - **Oracle的OCI(Oracle Call Interface)**:Oracle提供的C API,用于...

    oracle pro*c入门

    9. **带参动态SQL**:Pro*C允许使用动态SQL来构建和执行在运行时决定的SQL语句,这对于处理参数化查询非常有用。 10. **oci接口**:除了Pro*C,Oracle还提供了Oracle Call Interface (OCI),这是一种更底层的C接口...

    Pro*C增删改查Oracle数据库的代码

    Pro*C增删改查Oracle数据库中数据表的代码

    pro*c程序设计详解

    - **EXEC SQL**:这是Pro*C中用于插入SQL语句的关键字,如`EXEC SQL SELECT ... INTO ...`用于执行查询并存储结果。 - **声明和使用游标**:通过`EXEC SQL DECLARE cursor_name CURSOR FOR ...`声明游标,`EXEC ...

    VC整合Pro*C开发环境配置(图)

    Pro*C是Oracle公司提供的一种预编译器,它允许C/C++程序员直接在C或C++代码中嵌入SQL语句,从而实现与Oracle数据库的紧密交互。下面将详细阐述这一配置过程。 **1. 安装必要的组件** 首先,确保已经安装了以下组件...

    Pro*C

    **Pro*C**是一种由Oracle提供的C语言扩展,它允许开发者在C程序中直接嵌入SQL语句,并通过Oracle预编译器将其转换成标准C代码,从而实现数据库操作与业务逻辑的无缝集成。 #### 二、新特性介绍 - **ORACLE 9i ...

    Pro* C访问Oracle数据库技术研究.pdf

    Pro*C是C语言与Oracle数据库的一种融合,它允许开发者将C语言的灵活性与SQL的数据库操作能力相结合,从而实现高效的数据处理。 文章首先介绍了Pro*C的主要特点和优势。其一,Pro*C的源代码由C语言和内嵌的SQL语句...

Global site tag (gtag.js) - Google Analytics