Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103582609
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-30 20:52:13

第 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的负面:破坏了依赖链、代码更脆弱、很难调优。 

 

原文:http://canyang.blog.ccidnet.com/blog-htm-itemid-107046-do-showone-type-blog-uid-38235.html

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