博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态SQL和动态PL/SQL
阅读量:5827 次
发布时间:2019-06-18

本文共 1846 字,大约阅读时间需要 6 分钟。

16.1 NDS语句

16.1.1 EXECUTE IMMEDIATE语句

EXECUTE IMMEDIATE SQL_string   [INTO {
define_variable[, define_variable]...| record}]   [USING [IN | OUT | IN OUT] bind_argument

[, [IN | OUT | IN OUT] bind_argument]...];

我们可以把这个语句用于除了多行查询以外的任何SQL语句或者PL/SQL块。如果SQL_string后面带了分号,这就会按照一个PL/SQL块来处理;否则,就会按照DML或者DDL语句来处理。

16.1.2 OPEN FOR语句

OPEN {
cursor_variable |:host_cursor_variable} FOR SQL_string

[USING bind_argument [, bind_argument]...];

16.2 绑定变量

16.2.2 重复的占位符

  • 当我们执行一个动态SQL字符串,我们必须为每一个占位符都提供一个参数,即使这些占位符是重复的。
  • 如果我们执行的是一个动态PL/SQL块,我们必须为每一个唯一占位符提供一个参数。

16.2.3 NULL值的传递

我们不能直接将NULL直接量当做参数来进行传递。

  • 把NULL值隐藏在一个变量后面,如果用一个未初始化的的变量做起来会更容易些。* 通过转换函数把NULL值显式的转换成一个有类型的值。

16.4 动态PL/SQL

  • 动态字符串必须是在一个有效的PL/SQL块,这个块必须是以DECLARE或者BEGIN关键字开始,用END关键字和分号结束。如果字符串不是用分号结尾的,是不会被识别成PL/SQl块的。
  • 动态块中,我们只能访问属于全局作用范围的PL/SQl代码元素。
  • 在动态PL/SQL块招聘的错误可以在运行EXECUTE IMMEDIATE语句的局部块中捕获并处理。

16.5 NDS的建议

16.5.1 对于共享程序使用调用者权限

建议对所有的动态SQL程序都和要加上AUTHID CURRENT_USER子句,尤其对那些计划要提供给开发人员使用的程序更是如此。

16.5.2 预估并处理动态的错误

  • 在调用EXECUTE IMMEDIATE和OPEN FOR时,总是带上一个异常处理单元。
  • 在每一个异常处理句柄里,记录下或者显示错误发生时的错误消息以及SQL语句。
  • 也可以考虑在这些语句之前加上一个跟踪机制,这样我们就可以很容易的对动态SQL的构造和执行进行观察了。

16.5.3 使用绑定而不是拼接

  • 绑定通常更快速
  • 绑定的编写和维护都很容易
  • 绑定有助于避免隐式转换
  • 绑定避免了发生代码注入的可能性

不过,使用绑定也有一些潜在的缺陷。绑定变量会忽略柱状统计信息,因为绑定变量的值是在语句解析后赋值的。对于CBO来说,可用信息太少了,有可能无法为我们的SQL语句提供最好的执行计划。

16.5.5 把代码注入的风险最小化

  • 限制用户权限
  • 尽可能使用绑定变量
  • 检查动态文本中的危险文本
  • 用DBMS_ASSERT校验输入

16.6 使用时候使用DBMS_SQL

16.6.1 解析非常长的字符串

Oracle10g的EXECUTE IMMEDIATE所能执行的VARCHAR2字符串,其内容最大长度限制是32K。如果超过这个长度就要用DBM_SQL了。 不过11g中EXECUTE IMMEDIATE可以执行一个VARCHAR2字符串或者一个CLOB,后者的最大长度可以有4GB。

16.6.2 得到查询的列的信息

DBMS_SQL允许我们对动态游标中的列进行描述,以记录的关联数组形式返回每个列的信息。

16.6.4 把动态游标的解析最小化

EXECUTE IMMEDIATE有一个缺陷,每次执行一个动态字符串时,都需要重新准备,通常包括会解析、优化以及生成执行计划。对于大部分动态SQL的需求而言,这些步骤所带来的开销可以被NDS的一些其他好处所抵消。

16.7 Oracle11g新特性

16.7.1 DBMS_SQL.TO_REFCURSOR函数

16.7.2 DBMS_SQL.TO_CURSOR

对于标红的那句话在itpub中有实际的例子可以进行解释

转载于:https://www.cnblogs.com/JSD1207ZX/p/9386336.html

你可能感兴趣的文章
检测不到兼容的键盘驱动程序
查看>>
简单的分页存储过程,Json格式日期转换为一般日期
查看>>
jquery 选择器
查看>>
转://Oracle not in查不到应有的结果(NULL、IN、EXISTS详解)
查看>>
listbox用法
查看>>
冲刺第九天 1.10 THU
查看>>
一个不错的Node.js进阶学习引导
查看>>
《团队-科学计算器-项目总结》
查看>>
pythoy的configparser模块
查看>>
传值方式:ajax技术和普通传值方式
查看>>
Linux-网络连接-(VMware与CentOS)
查看>>
经典的CSS代码(转)
查看>>
Django
查看>>
MIPS中的异常处理和系统调用【转】
查看>>
Linux系统调用、新增系统调用方法【转】
查看>>
寻找链表相交节点
查看>>
jquery对象 与 document 对象的互为转换关系
查看>>
LeetCode OJ:Path Sum II(路径和II)
查看>>
Python 核心编程(第二版)——函数和函数式编程
查看>>
AS3——禁止swf缩放
查看>>