根据用户输入的表名,删除该表对应的数据, 根据用户输入的表名,删除该表对应的数据,由于 SQL变量在静态 变量在静态SQL 语句时不能应用到DELETE 语句时不能应用到 变量在静态 表名位置的, 表名位置的,所以没有办法在执行过程中通过静态 SQL 语句完成这样的功能。 语句完成这样的功能。 而动态SQL 语句则可以接受用户输入,动态的组织 语句则可以接受用户输入, 而动态 SQL 语句,完成上述要求。 语句,完成上述要求。
Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
1
Welcome to Pattern World… 目录
Pro*C概述 概述 Pro*C基础知识 基础知识 事务处理 动态 动态SQL技术 技术 总结
’DELETE FROM EMP WHERE DEPTNO = 20’ ’GRANT SELECT ON EMP TO scott’
缺点
此种方法每执行一次SQL 语句,数据库都需要解析一遍 语句,数据库都需要解析一遍SQL 此种方法每执行一次 语句 所以这种方法只适合运行一次或少数几次, 所以这种方法只适合运行一次或少数几次,否则严重影响应 用程序效率。 用程序效率。
2010-8-27
Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
3
Welcome to Pattern World… 动态SQL含义
动态 动态SQL 就是在应用程序执行期间组织、准备、 就是在应用程序执行期间组织、准备、
Oracle 动态 动态SQL不支持以下列表的数据类型: 不支持以下列表的数据类型 不支持以下列表的数据类型:
CURSOR 类型 结构数组(arrays of struct) 结构数组 DML 语句的返回子句 returning) 语句的返回子句( Unicode 变量 LOBS 类型
5
Welcome to Pattern World…动态SQL 适用环境
在应用程序执行时,如果以下元素在编写代码 在应用程序执行时,
时不确定就需要使用动态SQL: : 时不确定就需要使用动态
SQL 语句书写方式 SQL变量 SQL变量 / 宿主变量数目 SQL变量 SQL变量 / 宿主变量数据类型 未知Oracle 数据库 数据库Objects(表、视图、索引、列等 未知 表 视图、索引、列等) 属性
法,它增强了应用程序的灵活性和可扩展性,运行应 它增强了应用程序的灵活性和可扩展性, 用程序在运行状态时动态组织SQL 语句并执行和处理 用程序在运行状态时动态组织 执行结果。 执行结果。 Oracle支持如下两种动态 支持如下两种动态SQL语句 支持如下两种动态 语句
标准动态SQL语句 语句 标准动态 Oracle高级动态 高级动态SQL 语句 高级动态
2010-8-27
Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhe to Pattern World… 动态 动态SQL技术 技术
动态 动态SQL 编程是 编程是Pro*C/C++中一种比较高级的编程方 中一种比较高级的编程方
“DELETE FROM EMP WHERE MGR = :mgr_number AND JOB = :job_title” “DELETE FROM EMP WHERE MGR = :m AND JOB = :j”
2010-8-27
Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
10
Welcome to Pattern World… 无SQL变量的非查询语句 方法1: 方法 : 变量的非查询语句
2010-8-27 Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
7
Welcome to Pattern World… 动态SQL 执行条件(2)
嵌入式 嵌入式SQL 指令的字符串中,通常包含假的宿主变量 指令的字符串中, 这些假的宿主变量只为告诉预处理器在该位置需要进
2010-8-27
Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
9
Welcome to Pattern World… 使用动态SQL的方法
方法 :无SQL变量的非查询语句 方法1: 变量的非查询语句 方法 :已知输入变量个数的非查询语句 方法2: 方法 :已知 方法3:已知SELECT 语句选取列和输入宿主
11
Welcome to Pattern World… 方法 :代码示例 方法1:
char dynstmt1[10]; VARCHAR dynstmt2[80]; …… EXEC SQL EXECUTE IMMEDIATE "CREATE TABLE dyn1 (col1 VARCHAR2(4))"; strncpy( dynstmt1, "COMMIT ", 10 ); EXEC SQL EXECUTE IMMEDIATE :dynstmt1; strcpy( dynstmt2.arr, "DROP TABLE DYN1“ ); dynstmt2.len = strlen( dynstmt2.arr ); EXEC SQL EXECUTE IMMEDIATE :dynstmt2; EXEC SQL COMMIT RELEASE;
2010-8-27 Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
4
Welcome to Pattern World…动态SQL 的优缺点
优点: 优点:
2010-8-27
Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
6
Welcome to Pattern World… 动态SQL 执行条件(1)
无论如何执行动态 无论如何执行动态SQL 语句,都需要一个包含有效的 语句,
变量个数的查询语句 方法4: 方法 :
未知SELECT 语句选取列或输入宿主变量个数的查 未知 询语句 也适用于未知列名列表和输入宿主变量的其他DML 也适用于未知列名列表和输入宿主变量的其他 语句,只是其他语句处理比SELECT 查询定义游标 语句,只是其他语句处理比 要简单
2010-8-27
应用程序接收外界输入构造 应用程序接收外界输入构造SQL 语句到一个字符串 然后调用 然后调用EXECUTE IMMEDIATE 命令执行这个 命令执行这个SQL
语句 这种SQL 语句不能为 语句不能为SELECT 语句,不能包含输入变 语句, 这种 量的占位符。例如: 量的占位符。例如:
EXECUTE IMMEDIATE 命令的语法为: 命令的语法为:
EXEC SQL EXECUTE IMMEDIATE { :host_string | string_literal };
2010-8-27 Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
2010-8-27 Tiger.Wang
Email: Wangzhiyong512@ MSN: Wangzhiyong512@
12
Welcome to Pattern World… 方法2: 方法 :已知输入变量个数的非查询语句
行变量替换 这些假宿主变量不需要声明, 这些假宿主变量不需要声明,可以采用任意命名方式 如下两个语句对动态SQL来说是完全一样的,尽管有 来说是完全一样的, 如下两个语句对动态 来说是完全一样的 “:mgr_number、:job_title”和“:m、:j”在样式上的 、 和 、 在样式上的 区别,这些假宿主变量通常称为占位符号。 区别,这些假宿主变量通常称为占位符号。
SQL 语句(不包括 语句(不包括EXEC SQL 语句)、或下面嵌入式 语句)、 )、或下面嵌入式 SQL 指令的字符串: 指令的字符串:
ALLOCATE CLOSE DECLARE DESCRIBE EXECUTE FETCH FREE GET INCLUDE OPEN PREPARE SET WHENEVER
本文由xiaotuni贡献
ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
Welcome to Pattern World…
Pro*C程序设计 程序设计
Tiger Consultation Studio
2010-8-27
8
Welcome to Pattern World…
动态语句执行过程
通常一个应用程序提示用户输入 通常一个应用程序提示用户输入SQL语句组成要素到 语句组成要素到
宿主变量中 应用程序根据宿主变量值组织SQL语句 应用程序根据宿主变量值组织 语句 提交SQL语句到 语句到Oracle数据库服务器进行语法检查 提交 语句到 数据库服务器进行语法检查 Oracle绑定 绑定(bind)宿主变量到准备好的 宿主变量到准备好的SQL语句中,此 语句中, 绑定 宿主变量到准备好的 语句中 时Oracle得到宿主变量的地址,以能对变量内容进行 得到宿主变量的地址, 得到宿主变量的地址 读写 Oracle执行(execute)准备好的 执行( 执行 )准备好的SQL语句 语句 随着宿主变量的变化, 可以重复执行这条SQL 随着宿主变量的变化,Oracle可以重复执行这条 可以重复执行这条 语句。 语句。