动态SQL总结
PLSQL开发中动态SQL的使用方法
PLSQL开发中动态SQL的使用方法
在PL/SQL开发中,动态SQL是一种在程序运行时构建和执行SQL语句的方式。它允许我们根据特定条件和需求生成不同的SQL语句,以便在运行时动态地执行。
动态SQL的使用方法可以分为以下几个步骤:
1.构建动态SQL语句
在PL/SQL中,我们可以使用字符串变量来构建动态SQL语句。通过拼接字符串和使用条件语句,我们可以根据需要生成不同的SQL语句。例如:
```sql
DECLARE
sql_stmt VARCHAR2(200);
BEGIN
IF condition1 THEN
sql_stmt := 'SELECT * FROM table1';
ELSE
sql_stmt := 'SELECT * FROM table2';
ENDIF;
END;
```
2.执行动态SQL语句
一旦我们构建了动态SQL语句,可以使用EXECUTEIMMEDIATE语句将其执行。EXECUTEIMMEDIATE语句可以接受一个字符串参数,该参数包含要执行的SQL语句。例如:
```sql
EXECUTE IMMEDIATE sql_stmt;
```
3.使用绑定变量
为了避免SQL注入攻击和提高性能,我们应该使用绑定变量而不是直接将变量值嵌入到动态SQL语句中。绑定变量可以通过在动态SQL语句中使用冒号加上变量名称来指定。然后,我们可以使用USING子句将实际变量值绑定到动态SQL语句中的绑定变量上。例如:
```sql
DECLARE
sql_stmt VARCHAR2(200);
var1 VARCHAR2(100) := 'value1';
ibaties 动态sql 解析
ibaties 动态sql 解析
摘要:
1.动态SQL概述
2.ibatis动态SQL解析原理
3.动态SQL的优点与不足
4.实战应用案例解析
正文:
一、动态SQL概述
动态SQL,顾名思义,是一种可变的SQL语句,其可以根据特定条件生成不同的SQL查询语句。这种SQL语句通常应用于需要根据不同情况进行查询的情况下,如参数查询、分页查询等。动态SQL可以提高代码的可复用性、灵活性,降低维护成本。
二、ibatis动态SQL解析原理
ibatis是一款优秀的持久层框架,它支持动态SQL的解析和执行。其解析动态SQL的原理主要包括以下几个步骤:
1.解析动态SQL语句,提取关键字段、条件、动作等元素。
2.生成对应的SQL映射文件,用于存储动态SQL的解析结果。
3.在运行时,根据传入的参数和条件,动态生成最终的SQL语句并执行。
三、动态SQL的优点与不足
优点:
1.提高代码的可读性和可维护性。
2.降低数据库访问层的复杂性。
3.便于实现分页、参数查询等复杂查询。
不足:
1.编写和调试动态SQL较为复杂。
2.过多的动态SQL可能导致性能下降。
四、实战应用案例解析
案例一:分页查询
```
<select id="selectByPage" resultMap="userResultMap"> SELECT * FROM user
WHERE 1=1
<if test="pageNo != null and pageSize != null">
AND (SELECT COUNT(*) FROM user) > (CURRENT_PAGE * PAGE_SIZE)
关于动态SQL
关于动态SQL
前几天一个朋友要我写点关于数据库编程方面的东西,可一直由于工作比较忙,到现在已经一个多星期了,正好烟草的项目由于最终方案的原因而停止了,新的ATM的P端的程序昨天基本已经顺利调整完了。相信今天上午是个清闲的上午,就写点关于动态SQL方面的东西吧。
嵌入SQL语言都是静态SQL语言,即在编译时已经确定了引用的表和列。主变量不改变表和列信息。我们使用主变量改变查询参数,但是不能用主变量代替表名或列名。否则,系统报错。动态SQL语句就是来解决这个问题。
动态SQL语句的目的是,不是在编译时确定SQL的表和列,而是让程序在运行时提供,并将SQL语句文本传给DBMS执行。静态SQL 语句在编译时已经生成执行计划。而动态SQL语句,只有在执行时才产生执行计划。动态SQL语句首先执行PREPARE语句要求DBMS分析、确认和优化语句,并为其生成执行计划。DBMS还设置SQLCODE以表明语句中发现的错误。当程序执行完“PREPARE”语句后,就可以用EXECUTE语句执行执行计划,并设置SQLCODE,以表明完成状态。
使用动态SQL,共分成四种方法:
方法支持的SQL语句实现方法
1 该语句内不包含宿主变量,该语句不是查询语句 execute immediate
2 该语句内包含输入宿主变量,该语句不是查询语句 prepare和execute
3 包含已知数目的输入宿主变量或列的查询 prepare和fetch
4 包含未知数目的输入宿主变量或列的查询 prepare和fetch,用描述符
按照功能和处理上的划分,动态SQL应该分成两类来解释:动态修改和动态查询。方法1和方法2完成动态修改。方法3和方法4完成了动态查询。
SQL动态查询语句大全
学习SQL应知道的动态SQL语句基本语法
1 、普通SQL语句可以用Exec执行
eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N
2、字段名,表名,数据库名之类作为变量时,必须用动态SQL
eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格
当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名
declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错
declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
mysql动态sql语句基本语法
mysql动态sql语句基本语法
MySQL是一种流行的关系型数据库管理系统,它使用SQL语言来操作数据库。动态SQL语句是指在运行时根据不同条件生成不同的SQL语句,实现灵活的数据库操作。下面是MySQL动态SQL语句的基本语法:
1. SELECT语句:用于从数据库中检索数据。
示例:SELECT * FROM 表名 WHERE 条件;
2. INSERT语句:用于向数据库中插入新的数据。
示例:INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
3. UPDATE语句:用于更新数据库中的数据。
示例:UPDATE 表名 SET 字段1=新值1, 字段2=新值2 WHERE 条件;
4. DELETE语句:用于从数据库中删除数据。
示例:DELETE FROM 表名 WHERE 条件;
5. IF语句:用于在SQL语句中添加条件判断。
示例:IF(条件, 结果1, 结果2);
6. CASE语句:用于在SQL语句中实现多条件判断。
示例:CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN
结果2 ELSE 结果3 END;
7. WHILE语句:用于在SQL语句中实现循环操作。
示例:WHILE 条件 DO 语句 END WHILE;
8. FOR语句:用于在SQL语句中实现循环操作。
示例:FOR 变量名 IN 起始值..结束值 DO 语句 END FOR;
9. DECLARE语句:用于在SQL语句中声明变量。
示例:DECLARE 变量名数据类型 DEFAULT 默认值;
一种规避注入风险的动态sql语法
一种规避注入风险的动态sql语法注入攻击是一种常见的网络安全威胁,特别是在使用动态SQL语法的应用程序中。攻击者通过注入恶意代码来修改和执行SQL查询,从而获取未经授权的数据或者破坏数据库的完整性。为了规避这种注入风险,开发人员应该采取一系列措施来确保输入的数据不会被误解为可执行的SQL代码。下面介绍几种规避注入风险的常用动态SQL语法。
1.使用参数化查询
参数化查询是一种防止SQL注入攻击的有效方法。它通过将查询中的参数与特定的占位符绑定在一起,而不是将用户提供的输入直接嵌入到SQL查询语句中。参数化查询可以在各种编程语言和数据库管理系统中实现,例如使用预处理语句或存储过程。
2.输入验证和过滤
在执行动态SQL查询之前,应该对用户的输入进行严格的验证和过滤。验证用户输入的目的是确保它符合预期的格式和类型。对于字符串类型的输入,可以使用正则表达式或内置字符串处理函数来验证
其合法性。在过滤用户输入时,应该移除或转义可能被误解为SQL代码的特殊字符,例如单引号、双引号、分号等。
3.使用存储过程
存储过程是一种将SQL查询和业务逻辑封装在数据库服务器上的方法。与直接执行动态SQL查询相比,使用存储过程可以提供更高的安全性。存储过程的参数可以进行严格的验证和过滤,从而有效防止SQL注入攻击。
4.最小权限原则
为了减少潜在的损害范围,应该为数据库用户分配最小的权限。不需要修改数据库结构的用户应该具有只读或只写的权限,而不是具有对数据库的完全控制权限。这样即使发生了SQL注入攻击,攻击者也无法对数据库进行破坏或获取敏感数据。
动态SQL——精选推荐
动态SQL
执⾏动态SQL,可以使⽤EXEC(@sql),也可以存储过程sys.sp_executesql,由于参数是动态SQL暴露出来的,为了避免参数注⼊的风险,必须对参数做检查。相⽐EXEC(@sql),sys.sp_executesql是更安全的实现⽅式,因为后者会做参数的检查。
⼀,简单的SQL注⼊
简单举例,对于下⾯的动态SQL,由于没有对参数@tablename做检查,很容易导致SQL注⼊。
SET@sql= N'SELECT * FROM dbo.'+@tablename;
EXEC sys.sp_executesql @sql;
假如⽤户传递的参数值是:Users; DROP TABLE ers;
执⾏该动态SQL,会把删掉Users表。如何避免这种类型的SQL注⼊呢?解决⽅法有多种多样,⽐较简单的⼀种是使⽤QUOTENAME(),例如:
SET@sql= N'SELECT * FROM dbo.'+QUOTENAME(@tablename);
⼆,EXEC
把要执⾏的SQL语句转换成字符串,通过EXEC()函数来执⾏该语句,这是常规的⽅式,需要⽤户对参数进⾏检查:
EXEC(@sql)
根据我的经验,在编写动态SQL时,使⽤QUOTENAME()和REPLACE()更加安全和有效。当参数表⽰的表对象、视图对象或者字段时,建议使⽤QUOTENAME();当动态SQL的主题⽐较长时,可以设置占位符,⽐如##SQL_Block##,##Table_Name##,然后使⽤REPLACE()函数进⾏替换。
使用MySQL实现动态SQL查询和动态表名
使用MySQL实现动态SQL查询和动态表名一、引言
MySQL是目前最流行的关系型数据库管理系统之一,它的灵活性和强大的功能使得它成为了众多开发者和企业的首选。在实际的应用中,我们常常会遇到需要根据不同的条件动态生成SQL语句和表名的情况。本文将介绍如何使用MySQL
来实现动态SQL查询和动态表名。
二、动态SQL查询
动态SQL查询是指根据不同的条件生成不同的SQL语句,从而实现灵活的数据查询。在MySQL中,我们可以利用存储过程、预处理语句和动态执行语句来实现动态SQL查询。
1. 存储过程
存储过程是一组预定义的SQL语句和流程控制语句的集合,可以在执行之前编译和存储在数据库中。通过存储过程,我们可以通过参数的方式灵活地生成不同的SQL语句。例如,我们可以根据用户输入的条件动态地生成查询语句,并将结果返回给用户。
2. 预处理语句
预处理语句是一种特殊的SQL语句,可以提前对SQL语句进行编译和优化。在运行时,我们可以通过绑定变量的方式动态地传递参数,从而生成不同的SQL 语句。预处理语句可以提高SQL语句的执行效率,并且可以防止SQL注入等安全问题。
3. 动态执行语句
动态执行语句是一种将SQL语句字符串作为变量进行拼接和执行的方式。通
过动态执行语句,我们可以根据需要动态地生成SQL语句,并执行查询操作。然而,需要注意的是,动态执行语句的安全性和效率都比较低,容易导致SQL注入
和性能问题,所以在使用时需要谨慎。
三、动态表名
动态表名是指在SQL语句中使用变量来表示表名,从而实现对不同表的操作。在MySQL中,我们可以通过存储过程、预处理语句和动态执行语句来实现动态表名。
sql问题总结汇总
sql问题总结汇总
SQL(Structured Query Language)是一种用于管理关系型数
据库的标准化语言。它允许用户执行各种任务,如查询数据、插入
新数据、更新现有数据以及删除数据。以下是一些常见的SQL问题
的总结汇总:
1. 什么是SQL?
SQL是一种专门用于管理关系型数据库的标准化语言,它允
许用户执行各种任务,如查询、插入、更新和删除数据。
2. SQL中的主要命令有哪些?
SQL中的主要命令包括SELECT(用于从数据库中检索数据)、INSERT(用于向数据库中插入新数据)、UPDATE(用于更新数据库
中的数据)和DELETE(用于从数据库中删除数据)等。
3. 什么是SQL的约束?
SQL的约束用于定义表中数据的限制条件,包括主键约束、
唯一约束、非空约束和外键约束等,以确保数据的完整性和一致性。
4. 什么是SQL的连接?
SQL的连接用于将两个或多个表中的数据关联起来,以便进
行复杂的查询操作。常见的连接类型包括内连接、外连接和交叉连
接等。
5. 什么是SQL的聚合函数?
SQL的聚合函数用于对数据进行聚合计算,包括SUM(计算
总和)、AVG(计算平均值)、COUNT(计算行数)、MAX(计算最大值)和MIN(计算最小值)等。
6. 什么是SQL注入攻击?
SQL注入攻击是一种常见的网络安全漏洞,攻击者利用用户
输入的SQL命令来非法访问或篡改数据库中的数据,因此在编写
SQL语句时需要注意防范SQL注入攻击。
7. 什么是索引?
索引是一种用于提高数据库查询性能的数据结构,它可以加快数据检索的速度,常见的索引类型包括B树索引和哈希索引等。
MySQL中的动态SQL和参数化查询
MySQL中的动态SQL和参数化查询
一、引言
随着互联网的迅猛发展,数据处理和存储的需求也越来越大。MySQL作为一
种可靠而且高效的开源数据库管理系统,被广泛应用于各种应用程序中。在使用MySQL进行数据库查询时,我们常常会遇到一些需要动态生成SQL语句的情况,
同时也需要考虑查询的性能和安全性。在本文中,我们将探讨MySQL中的动态SQL和参数化查询的概念、用法和优点。
二、动态SQL的概念和用法
1. 动态SQL是指在程序中根据不同的条件和需求生成不同的SQL语句。与静
态SQL相比,动态SQL的查询条件和语句内容是可以变化的,更加灵活和适应各
种场景。
2. 在MySQL中,我们可以使用字符串拼接的方式来生成动态SQL语句。例如,当我们需要根据用户的输入条件进行查询时,可以使用如下方式:
```
String name = "John";
String sql = "SELECT * FROM users WHERE name = '" + name + "'";
```
这样我们就可以根据不同的name值生成不同的SQL语句,实现动态查询。
3. 动态SQL的用法在某些情况下非常灵活,但同时也存在一些问题。例如,
如果输入的条件中包含特殊字符或SQL注入攻击的风险,字符串拼接的方式可能
会导致安全性问题。此外,动态SQL也可能影响查询的性能,特别是在大规模数
据查询的情况下。
三、参数化查询的概念和优点
1. 参数化查询是一种使用预处理语句和参数来执行SQL查询的方法。与动态SQL直接拼接字符串的方式不同,参数化查询使用占位符来代替查询条件值,然
oracle动态sql语句基本语法
oracle动态sql语句基本语法
Oracle动态SQL语句是一种在运行时动态生成SQL语句的技术。它可以根据不同的条件和参数生成不同的SQL语句,从而实现更加灵活和高效的数据操作。下面是Oracle动态SQL语句的基本语法:
1. 使用EXECUTE IMMEDIATE语句执行动态SQL语句:
EXECUTE IMMEDIATE 'SELECT * FROM employees WHERE department_id = :dept_id' USING dept_id;
2. 使用BIND VARIABLES绑定变量:
DECLARE
v_dept_id NUMBER := 10;
v_sql VARCHAR2(100);
BEGIN
v_sql := 'SELECT * FROM employees WHERE department_id = :dept_id';
EXECUTE IMMEDIATE v_sql USING v_dept_id;
END;
3. 使用PL/SQL变量拼接SQL语句:
DECLARE
v_dept_id NUMBER := 10;
v_sql VARCHAR2(100);
BEGIN
v_sql := 'SELECT * FROM employees WHERE department_id = ' || v_dept_id;
EXECUTE IMMEDIATE v_sql;
END;
4. 使用CASE语句生成动态SQL语句:
DECLARE
v_dept_id NUMBER := 10;
动态sql语句(即sql语句的拼接)
动态sql语句(即sql语句的拼接)
10.1 if标签(属性:test(判断条件))
缺点:如果仅仅是第⼆个条件满⾜导致sql语句出错(故使⽤if+where)
1<select id="select1" resultType="er">
2 select *from user
3<if test="name!=null">
4 where name=#{name}
5</if>
6<if test="age!=null and age!=''">
7 and age=#{age}
8</if>
9</select>
10.2 if+where ( where标签会知道如果它包含的标签中有返回值的话,就会插⼊where 若其以and或or开头会将and或or剔除) 1<select id="select2" resultType="er">
2 select *from user
3<where>
4<if test="name!=null">
5 and name=#{name}
6</if>
7<if test="sex!=null">
8 and sex=#{sex}
9</if>
10<if test="age!=null and age!=''">
11 and age=#{age}
12</if>
13</where>
14</select>
mybatis动态sql原理
mybatis动态sql原理
MyBatis是一个优秀的Java持久层框架,它具有很强的动态SQL 功能。动态SQL可以让我们在SQL语句中根据需要动态地添加或删除一些语句段,从而生成一条最终的SQL语句。那么,MyBatis动态SQL 的实现原理是什么呢?下面将从以下几个方面阐述。
1. SQL语句的解析
MyBatis解析SQL语句时,会将所有的“#{}”或“${}”里面的内容都当做参数来处理,最终会转换成JDBC能够识别的SQL语句。其中,#{}是MyBatis所定义的预编译语句,可以有效避免SQL注入的问题;而${}则是直接把参数的值嵌入到SQL语句中,存在注入的风险。
2. 动态SQL标签的使用
MyBatis提供了多个动态SQL标签,如if、choose、when、otherwise、foreach等,通过它们,我们可以根据条件动态生成SQL 语句中的各种语句段。其中,if标签可以实现简单的条件判断;foreach标签可以用于遍历集合或数组;choose、when、otherwise标签可以模拟Java中的switch语句。
3. 动态SQL标签的嵌套
MyBatis允许动态SQL标签的嵌套使用,这也是其实现动态SQL 功能的关键之一。我们可以将多个if标签、foreach标签、choose标签等组合使用,生成更加复杂、灵活的SQL语句。
4. 动态SQL的缓存机制
MyBatis使用了缓存机制来提高动态SQL执行的效率。具体来说,MyBatis首先将SQL语句的字符串作为key,以SqlSource的形式作为value进行缓存;当第一次执行该SQL语句时,MyBatis会根据缓存中的SqlSource对象生成MappedStatement对象并缓存起来。这样,当下次再次执行相同的SQL语句时,MyBatis就可以从缓存中直接获取MappedStatement对象,提高了性能。
mybatis动态sql test用法
mybatis动态sqltest用法
==========
概述
--
MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。动态SQL则是MyBatis中的一个重要特性,它允许你在运行时构建SQL语句。本篇文章将介绍MyBatis动态SQL的Test用法,帮助你更好地理解和使用动态SQL。
一、动态SQL的类型
--------
在MyBatis中,动态SQL主要由三种类型构成:
1.`if`:根据条件判断,决定是否包含某个SQL片段。
2.`choose`、`when`、`otherwise`:类似于Java中的switch-case结构,根据条件执行不同的SQL片段。
3.`foreach`:用于迭代集合,生成批量插入的SQL语句。
二、Test用法详解
--------
Test是MyBatis提供的一个标签,用于在XML映射文件中构建动态SQL。它的用法非常灵活,可以结合其他标签来构建复杂的SQL语句。
###1.使用Test构建条件判断
可以使用Test标签结合if标签来构建条件判断的SQL语句。例如:
```xml
<selectid="findActiveUsers"resultType="User">
SELECT*FROMusersWHEREstatus=1
<Testcondition="status==1">ANDage>30</Test>
</select>
```
在上面的例子中,如果status字段的值为1,则会在SQL语句中添加一个条件`ANDage>30`。
mysql update动态sql语句基本语法
mysql update动态sql语句基本语法
在MySQL中,你可以使用动态SQL语句来根据某些条件更新数据。动态SQL语句通常结合`PREPARE`和`EXECUTE`语句来构建和执行。以下是一个基本的动态SQL更新语句的语法示例:
```sql
DELIMITER //
CREATE PROCEDURE dynamic_update(IN param1 INT, IN param2 VARCHAR(255))
BEGIN
SET sql = NULL;
-- 构建动态SQL语句
SET sql = CONCAT('UPDATE your_table_name SET column1 = value1 WHERE column2 = ?');
-- 准备SQL语句
PREPARE stmt FROM sql;
-- 绑定参数并执行SQL语句
SET value1 = param1;
EXECUTE stmt USING value1, param2;
-- 释放预备语句
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
```
在上面的示例中,`your_table_name`是你要更新的表名,`column1`是你要更新的列名,`value1`是你要设置的新值,`column2`是用于筛选要更新的行的条件列。`param1`和`param2`是输入参数,你可以根据需要修改它们的类型和值。
请注意,上述示例中的动态SQL语句只是根据给定的参数构建了一个更新语句,并使用`PREPARE`和`EXECUTE`执行它。在实际应用中,你可能需要根据具体情况修改动态SQL语句的构建逻辑和参数绑定方式。
mybatis动态sql的原理
mybatis动态sql的原理
MyBatis 的动态 SQL 是通过 XML 配置文件或注解的方式实现的,它的主要原理如下:
1. 解析 SQL 配置文件:MyBatis 首先会解析 XML 配置文件,将其中定义的 SQL 语句和参数信息解析出来。
2. 根据参数生成 SQL:使用解析得到的 SQL 语句模板和参数信息,MyBatis 会根据参数的值动态生成最终的 SQL 语句。在生成 SQL 过程中,MyBatis 会根据不同的情况判断使用哪些语句片段和条件。
3. 执行 SQL:MyBatis 将生成的 SQL 语句交给数据库进行执行,并获取执行结果。
4. 将结果映射到 Java 对象:MyBatis 通过配置文件或注解中定义的映射关系,将查询结果映射到相应的 Java 对象中,便于后续的数据操作和处理。
动态 SQL 的原理主要是通过在 SQL 配置文件中定义逻辑判断和循环等语句片段,结合参数值进行条件判断和 SQL 拼接,从而生成最终的 SQL 语句。这样可以根据不同的条件动态调整 SQL 语句,实现灵活的查询和更新操作。同时,MyBatis 还提供了 OGNL 表达式语言的支持,使得在 SQL 配置文件中可以通过表达式对参数进行进一步的处理和计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于动态SQL的一些总结
目的
动态SQL用于减小程序消耗并获取较高的执行性能,且容易编码,现越来越广泛的应用于数据库程序开发中。在SQL中,可以采用多种方式构造和执行动态SQL,比如EXECUTE IMMEDIATE、DBMS_SQL包等。由于ORACLE手册中并未覆盖这些功能,现简单说明下关于EXECUTE IMMEDIATE的用法。
名词定义
Oracle数据库开发PL/SQL块,常用SQL分为:静态SQL语句和动态SQL语句。
静态SQL,指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。
处理范围
◆语句可变:允许用户在程序运行时,临时动态创建完整的语句
◆条件可变:对于查询语句而言,语句的输出是确定的,但是查询子句(如WHERE
子句,GROUP BY子句,HAVING子句等)可变
◆数据库对象等其他可变:对于别名,查询的表名、视图、过程名、DBLINK名等,
临时构建,均不确定。
语法
EXECUTE IMMEDIATEdynamic_string
[INTO {define_variable [ , define_variable ] … |record}]
[USING [IN | OUT | IN OUT ] bing_argument [, [IN | OUT | IN OUT ] bing_argument] … ]
[{RETURNING | RETURN} INTObind_argument [,bind_argument] … ]
◆dynamic_string用于指定存放SQL语句或PL/SQL块的字符串变量;define_variable
用于指定存放单行查询结果的变量;bind_argument用于存放传递的输入、输出变量。
◆dynamic_string语句需用单引号括起来,需要使用特殊符号的地方需注意转义,如使
用引号时,用’’代替’;需要使用变量的地方,可以直接用:号加变量名,也可以用 || 连接符将直接调用变量。区别在于EXECUTE IMMEDIATE语句中,前者需要加USING传入变量,后者不用。
使用范例
1.一般执行语句:
Begin
EXECUTEIMMEDIATE'create table tab_test(test_code
varchar2(200),test_value varchar2(20),remark varchar2(200))';
End;
2.带传入参数的动态语句(USING语句):
3.带传出参数的动态语句(INTO语句):
Declare
Iv_sql VARCHAR2(2000);
Iv_count NUMBER(30);
Begin
iv_sql :='SELECT count(1) '||
' FROMti_ng_user t' ||
'WHERE t.stat_month = to_date(SYSDATE,''YYYYMM'')';
EXECUTEIMMEDIATE iv_sql INTO Iv_count;
End;
4.调用过程时,用到的绑定变量参数必须指定参数类型,默认为IN型,其他类型需
显式指定:
Declare
Iv_sql VARCHAR2(2000);
Iv_count NUMBER(30);
Iv_channelno NUMBER:=1;
Iv_date VARCHAR2(8):='20111205';
Iv_resultcode NUMBER;
Iv_resulterrinfo VARCHAR2(200);
Begin
iv_sql :='Begin '||
'P_sdr_sal_audit(:1,:2,:3,:4);'||
'End;';
EXECUTEIMMEDIATE iv_sql USINGIN Iv_channelno,IN Iv_date,
OUT Iv_resultcode,OUT Iv_resulterrinfo;
End;
注:需传入和传出参数时,用引入符号“:”来表明动态变量。冒号后可跟自定义变量名,也可以跟数字。只是用作位置标示,无实际意义。
5.INTO子句用在USING子句前:
Declare
Iv_sql VARCHAR2(2000);
Iv_count NUMBER(30);
Iv_depart VARCHAR2(10);
Begin
iv_sql :='SELECT count(1) '||
' FROM td_m_staff t '||
' WHERE t.depart_id = :1';
EXECUTEIMMEDIATE iv_sql INTO Iv_count USING Iv_depart;
End;
6.实现处理多行(EXECUTE语句只能处理单行查询,所以需借助游标进行多行处理)
DECLARE
TYPE EMPCURSOR ISREFCURSOR;
EMP EMPCURSOR;
EMP_RECORD TD_M_STAFF%ROWTYPE;
IV_SQL VARCHAR2(1000);
BEGIN
IV_SQL :='SELECT * FROM TD_M_STAFF T WHERE T.DEPART_ID = :1';
OPEN EMP FOR IV_SQL USING&DNO;
LOOP
FETCH EMP INTO EMP_RECORD;
EXITWHEN EMP%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('员工名:'||emp_record.staff_name||',工资:
'||emp_record.staff_sal);
Endloop;