动态sql是一种在运行时生成和运行sql语句的编程方法论。 比如像蜂窝网查询系统写通用目的灵活程序的时候,当编写必须运行数据库定义语句程序的时候;当在编译时候,不能确定所有的sql语句或者它的输入输出数据以及数据类型的时候,PLSQL动态SQL是很有用的。 PLSQL提供了两种编写动态SQL的方式: ==1.本地动态SQL==:构建和运行动态SQL语句的PLSQL语言; ==2.DBMD_SQL包==:构建、运行和描述动态SQL语句的API; 本地动态SQL代码相比于DBMD_SQL包,更容易阅读和编写,并且运行速度也很快(特别是可以被编译器进行优化的时候)。然而,为了去编写本地动态SQL代码,必须知道动态语句的输入和输出变量的数据以及数据类型。如果在编译时,不知道这些信息,则必须使用DBMD_SQL包。如果你想让存储程序显示的查询结果,也必须使用DBMD_SQL包。 当你需要DBMD_SQL包和本地动态SQL,可以使用DBMS_SQL.TO_REFCURSOR Function和在他们之间进行切换,

一、什么时候需要动态SQL

在PLSQL中,需要动态SQL去运行:

  • ==在编译期间,SQL语句是不清除的==。比如:在编译期间,SELECT语句中包含一个未知的标识符,或者在WHERE条款中包含一个未知的子语句数值;
  • 静态SQL不支持的SQL。 如果不用动态SQL,而是使用静态SQL,有下面这些优势:
  • 成功的编译可以验证静态SQL语句引用有效的数据库对象,也可以验证放置必要的优先级访问这些对象。
  • 成功的编译创建schema对象依赖。

二、本地动态SQL

本地动态SQL使用EXECUTE IMMEDIATE语句处理许多的动态SQL语句。 如果动态SQL语句是一个返回多行数据的SELECT语句,本地动态SQL有下面这些选择:

  • 使用携带BULK COLLECT INTO条款的EXECUTE IMMEDIATE语句;
  • 使用OPEN FOR, FETCH和 CLOSE语句。 在本地动态SQL INSERT,UPDATE, DELETE, MERGE和单行SELECT语句像静态SQL一样执行之后,SQL cursor属性一样的工作方式。