动态SQL是在运行时生成和执行SQL语句的编程方法。动态是和静态相对而言的。静态SQL指的是在代码编译时刻就已经包含在代码中的那些已经充分明确的固定的SQL语句。
PL/SQL提供了两种方式来编写动态SQL:
本地动态SQL代码比同等代码使用DBMS_SQL包更容易读和写,运行数据更快。然而,编写本地动态SQL,你必须知道在运行时动态SQL语句的输入和输出的变量类型和数量。如果在运行你不知道这种信息,就必须使用DBMS_SQL包。
下面主要介绍本地动态SQL语句的语法。
execute_immediate_statement::=
into_clause::=
bulk_collect_into_clause::=
using_clause::=
dynamic_returning_clause::=
into_clause::=
bulk_collect_into_clause::=
一个传递到动态SQL语句的表达式值(IN绑定),或是一个存储动态SQL语句返回值的变量(OUT绑定)。
如果使用仅当动态SQL语句可以返回多行,此子句指定一个或多个集合存储返回行。该子句必须有一个相应的兼容型集合或数组来存储动态SQL语句的查询列。
一个声明的集合,用来存储动态SQL语句返回行。
如果使用仅当动态SQL语句有RETURNING INTO子句,这个子句返回动态SQL语句受影响行的列值,独立变量或记录。该子句可以包括OUT绑定参数。
一个字符串常量,字符串变量,或表示SQL语句的字符串表达式,必须是CHAR、VARCHAR2或者CLOB类型。
返回行数组进行存储,该数组必须声明一个PL / SQL主机环境中,并传递给PL/ SQL绑定参数(冒号(:)前缀)
绑定参数的参数模式,IN绑定参数传递值到动态SQL语句,OUT绑定参数存储动态SQL语句返回值。IN OUT绑定参数传递初始值到动态SQL语句,并存储动态SQL语句返回值。默认绑定参数的参数模式是IN。
当且仅当动态SQL语句是一个SELECT语句,最多可以返回一行。此子句指定变量或记录存储返回行的列值。对于每个动态SQL语句查询列,必须有相应的自定义变量兼容类型和记录兼容类型。
存储返回行的用户自定或%rowtype记录。
当且仅当动态SQL语句包含占位符,指定绑定参数列表。
使用事项:
对于有RETURNING
子句的DML语句,你可以把OUT绑定参数放到RETURNING
INTO
子句中,无需指定参数模式。如果同时使用USING子句和RETURNING
INTO
子句,USING子句只能包含IN参数。
绑定参数值不能是布尔字面量(TRUE,FALSE,NULL)。如果想要传递NUL值到动态SQL,可以使用未初始化变量。
OPEN-FOR语句执行游标变量相关的SELECT语句。
open_for_statement ::=
using_clause::=
当前作用域内已申明的游标变量或者无返回类型的游标参数。
必须在PL/SQL主机环境已被申明,并通过PL/SQL作为绑定参数的游标变量。游标变量的数据里类型必须兼容任何PL/SQL游标变量的返回类型。
一个字符串常量,字符串变量,或字符串表达式,表示多行的SELECT语句(不包括最后的分号)与cursor_variable_name相关。它必须是类型为CHAR,VARCHAR2,CLOB(NCHAR或NVARCHAR2)。
一个字符串常量,字符串变量,或字符串表达式,表示任何SQL语句。它必须是类型为CHAR,VARCHAR2,CLOB。、
当且仅当select_statment包括占位符,此子句指定绑定参数列表。
一个传递到动态SQL语句的表达式值(IN绑定),或是一个存储动态SQL语句返回值的变量(OUT绑定)。默认绑定参数模式是IN。