oracle笔记动态SQL
2006-11-01 07:19
281 查看
第 16 章 动态sql
16.1 为何使用动态sql
实现动态sql有两种方式:dbms_sql和本地动态sql(execute immeidate)
主要从以下方面考虑使用哪种方式:
1. 是否知道涉及的列数和类型
dbms_sql包括了一个可以“描述”结果集的存储过程(dbms_sql.describe_columns),而本地动态sql没有。
2. 是否知道可能涉及的绑定变量数和类型
dbms_sql允许过程化的绑定语句的输入,而本地动态sql需要在编译时确定。
3. 是否使用“数组化”操作(array processing)
dbms_sql允许,而本地动态sql基本不可以,但可以用其他方式实现(对查询可用fetch bulk collect into,对insert等,可用一个begin … end块中加循环实现)。
4. 是否在同一个会话中多次执行同一语句
dbms_sql可以分析一次执行多次,而本地动态sql会在每次执行时进行软分析。
5. 是否需要用ref cursor返回结果集
仅本地动态sql可用ref cursor返回结果集。
16.2 如何使用动态sql
dbms_sql
1. 调用open_cursor获得一个游标句柄;
2. 调用parse分析语句。一个游标句柄可以用于多条不同的已分析语句,但一个时间点仅一条有效;
3. 调用bind_variable或bind_array来提供语句的任何输入;
4. 若是一个查询(select语句),调用difine_column或define_array来告知oracle如何返回结果;
5. 调用execute执行语句;
6. 若是一个查询,调用fetch_rows来读取数据。可以使用column_value从select列表根据位置获得这些值;
7. 否则,若是一个pl/sql块或带有return子句的dml语句,可以调用variable_value从块中根据变量名获得out值;
8. 调用close_cursor.
注意这里对任何异常都应该处理,以关闭游标,防止泄露资源。
本地动态sql
execute immediate ‘语句’
[into {变量1, 变量2, … 变量n | 记录体}]
[using [in | out | in out] 绑定变量1, … 绑定变量n]
[{returning | return} into 输出1 [, …, 输出n]…];
注意本地动态sql仅支持弱类型ref cursor,即对于ref cursor,不支持bulk collect.
16.3 最后说明
动态sql的负面:破坏了依赖链、代码更脆弱、很难调优。
16.1 为何使用动态sql
实现动态sql有两种方式:dbms_sql和本地动态sql(execute immeidate)
主要从以下方面考虑使用哪种方式:
1. 是否知道涉及的列数和类型
dbms_sql包括了一个可以“描述”结果集的存储过程(dbms_sql.describe_columns),而本地动态sql没有。
2. 是否知道可能涉及的绑定变量数和类型
dbms_sql允许过程化的绑定语句的输入,而本地动态sql需要在编译时确定。
3. 是否使用“数组化”操作(array processing)
dbms_sql允许,而本地动态sql基本不可以,但可以用其他方式实现(对查询可用fetch bulk collect into,对insert等,可用一个begin … end块中加循环实现)。
4. 是否在同一个会话中多次执行同一语句
dbms_sql可以分析一次执行多次,而本地动态sql会在每次执行时进行软分析。
5. 是否需要用ref cursor返回结果集
仅本地动态sql可用ref cursor返回结果集。
16.2 如何使用动态sql
dbms_sql
1. 调用open_cursor获得一个游标句柄;
2. 调用parse分析语句。一个游标句柄可以用于多条不同的已分析语句,但一个时间点仅一条有效;
3. 调用bind_variable或bind_array来提供语句的任何输入;
4. 若是一个查询(select语句),调用difine_column或define_array来告知oracle如何返回结果;
5. 调用execute执行语句;
6. 若是一个查询,调用fetch_rows来读取数据。可以使用column_value从select列表根据位置获得这些值;
7. 否则,若是一个pl/sql块或带有return子句的dml语句,可以调用variable_value从块中根据变量名获得out值;
8. 调用close_cursor.
注意这里对任何异常都应该处理,以关闭游标,防止泄露资源。
本地动态sql
execute immediate ‘语句’
[into {变量1, 变量2, … 变量n | 记录体}]
[using [in | out | in out] 绑定变量1, … 绑定变量n]
[{returning | return} into 输出1 [, …, 输出n]…];
注意本地动态sql仅支持弱类型ref cursor,即对于ref cursor,不支持bulk collect.
16.3 最后说明
动态sql的负面:破坏了依赖链、代码更脆弱、很难调优。
相关文章推荐
- ORACLE动态SQL笔记
- 学习笔记_oracle——游标与动态SQL
- ORACLE官方SQL语言参考笔记之Oracle SQL的基本元素篇(第三章-第二节)
- oracle 11g 学习笔记 10_30(2)_数据字典和动态性能视图
- ORACLE 动态SQL中的多个单引号
- Oracle笔记:pl/sql过程、函数、包
- 研究Oracle中动态SQL语句太长的问题
- Oracle中动态SQL详解
- oracle 不能是用变量来作为列名和表名 ,但使用动态sql可以;
- ORACLE 包内的存储过程的动态sql
- ORACLE 包内的存储过程的动态sql
- Oracle笔记 九、PL/SQL 游标的使用
- Oracle笔记 九、PL/SQL 游标的使用
- ORACLE PL/SQL 记录(Record)学习笔记(一)
- Oracle中动态SQL详解(EXECUTE IMMEDIATE)
- Oracle动态性能表(1)-V$SQLAREA
- 基于Oracle的高性能动态SQL程序开发
- Oracle 笔记(三)、SQL*PLUS 相关
- 关于Oracle 的定时执行作业问题(动态PL/SQL)
- 【安博培训笔记】Oracle2 基本SQL查询 作业20130909