3.动态SQL
- 格式:pptx
- 大小:3.27 MB
- 文档页数:36
关于动态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用于存放传递的输入、输出变量。
mysql 存储过程中执行动态sql语句的方法在MySQL存储过程中执行动态SQL语句通常使用的方法有以下几种:1. 使用PREPARE和EXECUTE语句:这是一种常见的方法,可以动态地生成SQL语句并执行。
首先,使用PREPARE语句定义一个预编译的SQL语句,然后使用EXECUTE语句执行该语句。
下面是一个示例:```DECLARE @sql_statement VARCHAR(1000);SET @sql_statement = 'SELECT * FROM table_name';PREPARE stmt FROM @sql_statement;EXECUTE stmt;DEALLOCATE PREPARE stmt;```这里将查询语句存储在一个变量中,然后用PREPARE将其准备好,最后使用EXECUTE执行该语句。
注意,PREPARE 后的语句需要使用DEALLOCATE释放。
2. 使用CONCAT函数拼接SQL语句:可以使用MySQL的CONCAT函数动态构建SQL语句。
下面是一个示例:```DECLARE @sql_statement VARCHAR(1000);SET @sql_statement = CONCAT('SELECT * FROM ',table_name);PREPARE stmt FROM @sql_statement;EXECUTE stmt;DEALLOCATE PREPARE stmt;```这里使用CONCAT函数将查询的表名动态拼接到SQL语句中。
3. 使用IF语句根据条件执行不同的SQL语句:可以在存储过程中使用IF语句根据条件选择不同的SQL语句执行。
下面是一个示例:```DECLARE @sql_statement VARCHAR(1000);IF condition THENSET @sql_statement = 'SELECT * FROM table_1';ELSESET @sql_statement = 'SELECT * FROM table_2';END IF;PREPARE stmt FROM @sql_statement;EXECUTE stmt;DEALLOCATE PREPARE stmt;```这里根据条件选择不同的表执行查询操作。
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 userWHERE 1=1<if test="pageNo != null and pageSize != null">AND (SELECT COUNT(*) FROM user) > (CURRENT_PAGE * PAGE_SIZE)</if></select>```案例二:参数查询```<select id="selectByCondition" resultMap="userResultMap"> SELECT * FROM userWHERE 1=1<if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></select>```总结:动态SQL在实际开发中具有一定的优势,可以提高代码的可读性和灵活性。
动态sql语句查询实现自定义列名的方法在进行动态SQL语句查询时,有时候需要根据不同的业务需求自定义列名来返回查询结果。
这种需求可以通过使用SQL的列别名来实现。
我们需要构建一个动态SQL语句,其中包含我们需要查询的列以及相应的别名。
假设我们有一个名为"employees"的表,其中包含"employee_id"、"first_name"和"last_name"三个列,我们希望查询结果中的列名分别为"员工编号"、"姓"和"名",可以按照以下步骤进行操作:1. 使用SELECT语句编写动态SQL语句的基础框架:```sqlSELECT column1 AS alias1, column2 AS alias2, ...FROM table_nameWHERE condition;```2. 根据我们的需求,在SELECT语句中为每个列添加相应的别名:```sqlSELECT employee_id AS '员工编号', first_name AS '姓',last_name AS '名'FROM employees;```这样,当执行上述SQL语句时,返回的查询结果将包含按照自定义的列名进行命名的结果集。
需要注意的是,在编写动态SQL语句时,应该确保列名的唯一性,避免出现重复的列别名。
此外,在实际应用中,可能还需要对列名进行一些特殊字符的处理,以使其符合具体的要求。
总结一下,通过使用SQL的列别名功能,我们可以实现动态SQL语句查询中自定义列名的方法。
这为我们在满足业务需求的同时,提供了更灵活的结果展示方式。
使用动态SQL语句实现简单的行列转置(动态产生列)要实现简单的行列转置,并动态产生列,可以使用动态SQL语句来实现。
首先,假设有一个表格`table1`,有`id`、`name`和`value`三个字段,我们要将`name`字段的值转换为列名,并将`value`字段的值填充到相应的位置。
动态SQL语句的实现步骤如下:
1. 使用`GROUP_CONCAT`函数将`name`字段的值连接成一个字符串,作为动态列名。
2.使用`CONCAT`函数拼接SQL语句,动态生成列的部分。
3. 使用`GROUP BY`子句将数据按照`id`字段进行分组。
4.使用动态生成的SQL语句进行查询。
下面是实现的示例代码:
```sql
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(name = "', name, '", value, NULL)) AS "', name, '"'))
FROM table1;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
```
以上代码将会将`name`字段的值转换为列名,并将`value`字段的值填充到相应的位置,然后按照`id`字段进行分组,返回转置后的结果。
需要注意的是,动态SQL语句的生成需要使用`PREPARE`和`EXECUTE`语句,并在使用完毕后使用`DEALLOCATEPREPARE`释放资源。
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直接拼接字符串的方式不同,参数化查询使用占位符来代替查询条件值,然后通过传递参数的方式执行查询。
2. 在MySQL中,参数化查询可以通过PreparedStatement对象来实现。
例如,我们可以使用如下方式执行参数化查询:```String sql = "SELECT * FROM users WHERE name = ?";PreparedStatement statement = connection.prepareStatement(sql);statement.setString(1, "John");ResultSet resultSet = statement.executeQuery();```这样,我们可以直接将查询条件传递给PreparedStatement对象,而不需要将其直接拼接到SQL语句中。
简述一下动态sql的执行原理动态 SQL 是 MyBatis 提供的一种功能,允许在 XML 映射文件中使用动态 SQL 元素,根据不同条件动态构建 SQL 语句。
动态 SQL 的执行原理可以简要概括如下:1. 解析 XML 映射文件:• MyBatis 在启动时解析 XML 映射文件,包括其中的动态 SQL 元素(如 <if>、<choose>、<foreach> 等)。
•动态 SQL 元素被解析为相应的数据结构,如 SqlNode。
2. 构建 SQL 语句:•在执行SQL 语句前,MyBatis 根据动态SQL 元素中的逻辑判断,决定是否包含或排除某些 SQL 片段。
•动态 SQL 元素中的条件判断会根据运行时的参数进行动态计算。
3. 组装 SQL 语句:•根据动态构建的 SQL 片段,MyBatis 组装最终的 SQL 语句。
•这个组装过程可能会包含条件判断、循环拼接等动态逻辑。
4. 创建 SqlSource:• MyBatis 根据组装得到的 SQL 语句以及参数映射信息,创建一个 SqlSource 对象。
• SqlSource 包含了最终的 SQL 语句以及参数映射。
5. 创建 MappedStatement:• MyBatis 使用 SqlSource 创建一个 MappedStatement 对象,它包含了 SQL 语句的信息,如 ID、参数映射、结果映射等。
• MappedStatement 是MyBatis 中表示一条SQL 语句的重要数据结构。
6. 执行 SQL:•在运行时,当调用相应的 Mapper 接口方法时,MyBatis 根据MappedStatement 获取 SQL 语句并执行。
•动态 SQL 的条件判断和逻辑将在运行时进行计算,根据实际参数值动态构建 SQL 语句。
动态SQL 的执行原理允许根据不同的条件生成不同的SQL 语句,从而实现更加灵活的数据库操作。
学习SQL应知道的动态SQL语句基本语法1、普通SQL语句可以用Exec执行eg:Select*from tableNameExec('select*from tableName')Exec sp_executesql N'select*from tableName'--请注意字符串前一定要加N2、字段名,表名,数据库名之类作为变量时,必须用动态SQLeg: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'Exec(@s)--成功exec sp_executesql@s--此句正确3、输出参数declare@num int,@sqls nvarchar(4000)set@sqls='select count(*)from tableName'exec(@sqls)--如何将exec执行结果放入变量中?declare@num int,@sqls nvarchar(4000)set@sqls='select@a=count(*)from tableName'exec sp_executesql@sqls,N'@a int output',@num outputselect@num此外,如果想要在SQL语句字符串中使用单引号''可以使用''''SQL Server数据库中经常用到的identity列发布时间:2008.03.2404:59来源:赛迪网作者:Alice【赛迪网-IT技术报道】SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便。
动态SQL详解动态SQL在之前⽤户所编写的PL/SQL程序时有⼀个最⼤的特点:就是所操作的数据库对象(例如:表)必须存在,否则创建的⼦程序就会出问题,⽽这样的操作在开发之中被称为静态SQL操作,⽽动态SQL操作可以让⽤户在定义程序时不指定具体的操作对象,⽽在执⾏时动态的传⼊所需要的数据库对象,从⽽使程序变得更加的灵活。
创建⼀个功能,输⼊表名,输出表中有多少⾏,若没有这个表,则创建这个表。
⾸先禁⽤所有触发器GRANT CREATE ANY TABLE TO SCOTTcreate or replace function get_table_count_fun(p_table_name varchar2) return number asv_sql_statement varchar2(200);--定义操作的SQL语句v_count number;--保存表中记录beginselect count(*) into v_count from user_tables where table_name=UPPER(p_table_name);if v_count=0 then--数据表不存在v_sql_statement:='CREATE TABLE '|| p_table_name ||'(id number ,name varchar2(30) not null)';--创建数据表,注意此处不要忽略空格,按照正常写create table语句的格式加空格,否则⽆法识别execute immediate v_sql_statement;--执⾏动态SQLend if;v_sql_statement:=' select count(*) from '|| p_table_name;--查询数据表记录,注意加空格execute immediate v_sql_statement into v_count;--执⾏动态SQL并保存数据记录return v_count;end;/declarev1 varchar2(100);beginv1:=get_table_count_fun('t100');--查看t100表dbms_output.put_line(v1);end;/EXECUTE IMMEDIATE语句在动态SQL之中EXECUTE IMMEDIATE是最为重要的执⾏命令,使⽤此语句可以⽅便的在PL/SQL程序之中执⾏DML(INSERT/UPDATE/DELETE/单列SELECT)、DDL(CREATE/ALTER/DROP)、DCL(GRANT/REVOKE)语句,EXECUTE IMMEDIATE语法定义如下:EXECUTE IMMEDIATE 动态SQL字符串 [[BULK COLLECT]] INTO ⾃定义变量,...|记录类型|[USING [IN | OUT |IN OUT|绑定参数,...][[RETURNING | RETURN][BULK COLLECT] INTO 绑定参数,...];EXECUTE IMMEDIATE由以下三个主要字句组成:INTO:保存动态SQL执⾏结果,如果返回多⾏记录可以通过BULK COLLECT设置批量保存;USING:⽤来为动态SQL设置占位符设置内容;RETURNING | RETURN:两者使⽤效果⼀样,是取得更新表记录被影响的数据,通过BULK COLLECT来设置批量绑定。
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的实现是建立在SQL语句解析、动态SQL标签的使用、标签的嵌套、以及缓存机制等多个方面的基础上的。
oracle动态 sql 方法Oracle动态SQL方法简介Oracle数据库提供了一系列方法来处理动态SQL。
动态SQL是一种可以在运行时构建和执行的SQL语句。
它可以根据不同的条件和变量来生成不同的查询,从而实现更灵活和可扩展性的数据库操作。
在本文中,我们将详细介绍一些常用的Oracle动态SQL方法,并提供示例代码来说明每种方法的用法和效果。
1. EXECUTE IMMEDIATE语句EXECUTE IMMEDIATE语句是Oracle中最常用的动态SQL方法之一。
它允许我们在运行时执行一个动态的SQL字符串。
以下是EXECUTE IMMEDIATE语句的基本语法:EXECUTE IMMEDIATE dynamic_sql_string;其中,dynamic_sql_string是一个包含动态SQL语句的字符串。
示例下面是一个使用EXECUTE IMMEDIATE语句查询员工表中特定部门的示例:DECLAREsql_string VARCHAR;department_id NUMBER := 10;BEGINsql_string := 'SELECT * FROM employees WHERE departmen t_id = ' || department_id;EXECUTE IMMEDIATE sql_string;END;上述示例中,sql_string是一个包含动态SQL的字符串,我们将department_id变量的值拼接到字符串中,从而实现根据不同部门查询的动态效果。
2. 使用BIND变量为了提高动态SQL的执行效率和安全性,我们可以使用BIND变量代替直接在SQL语句中拼接变量值。
BIND变量以冒号(:)开头,表示在运行时由程序提供变量值。
以下是一个使用BIND变量的示例:DECLAREdynamic_sql_string VARCHAR := 'SELECT * FROM employees WHERE department_id = :dept_id';department_id NUMBER := 10;BEGINEXECUTE IMMEDIATE dynamic_sql_string USING department_ id;END;在上述示例中,:dept_id是一个BIND变量,它在运行时将被department_id的值替代。
jfinal 动态sql语句基本语法摘要:1.JFinal 简介2.动态SQL 语句的概念3.JFinal 中动态SQL 语句的基本语法4.示例正文:【1.JFinal 简介】JFinal 是一款基于Java 语言的Web 开发框架,它具有简洁、快速、安全的特点。
在JFinal 中,我们可以使用动态SQL 语句来构建动态的SQL 查询,从而满足不同场景下的查询需求。
【2.动态SQL 语句的概念】动态SQL 语句是指在程序运行时,根据程序的实际需求动态生成的SQL 查询语句。
与静态SQL 语句相比,动态SQL 语句具有更好的灵活性和可扩展性。
【3.JFinal 中动态SQL 语句的基本语法】在JFinal 中,我们可以使用`Sql`类和`SqlSegment`类来构建动态SQL 语句。
以下是一些基本的语法示例:- 构建简单的动态SQL 查询:```javaSql sql = new Sql();sql.select("id, name").from("user");```- 构建带条件的动态SQL 查询:```javaSql sql = new Sql();sql.select("id, name").from("user").where("age >", 18);```- 构建复杂的动态SQL 查询:```javaSql sql = new Sql();sql.select("id, name").from("user").where("age >", 18).and("gender =", "male");```- 使用`SqlSegment`构建动态SQL 查询:```javaSqlSegment sqlSegment = new SqlSegment("user", "id, name");sqlSegment.where("age >", 18);sqlSegment.and("gender =", "male");```【4.示例】以下是一个简单的示例,展示如何使用JFinal 的动态SQL 语句查询用户信息:```javapublic void queryUserInfo() {Sql sql = new Sql();sql.select("id, name, age, gender").from("user").where("age >", 18).and("gender =", "male");List<Map<String, Object>> userList = sql.queryForList();for (Map<String, Object> userInfo : userList) {System.out.println(userInfo);}}```通过以上示例,我们可以看到如何使用JFinal 的动态SQL 语句来查询满足条件的用户信息。
1.什么是动态SQL?动态SQL是指在运行PL/SQL块时动态输入SQL语句。
在PL/SQL块中只能执行DDL(create、alter、drop)、DCL(grant、revoke)或比较灵活的SQL语句(如select子句不带where条件);动态SQL的性能不如静态SQL,但是比较灵活;在PL/SQL块中编写动态SQL语句时需要将SQL语句存放到字符串变量中而且SQL语句可以包含占位符(以冒号开始);2.动态SQL的语法2.1 使用execute immediate语句可以处理多数动态SQL操作如:DDL语句(create、alter、drop)、DML语句(insert、update、delete)、DCL(grant、revoke)以及单行的select子句;但是不能处理多行查询语句。
2.2 使用open...for,fetch和close语句在游标中使用。
2.3 使用批量动态SQL语句*/---------------------------------------------------------------***************************************************************1. 使用execute immediate---------------------------------------------------------------1.1 使用execute immediate处理DDL语句-----------------------------------------------------------------案例01:使用execute immediate处理DDL语句--createdeclarecreate_table varchar2(200);begincreate_table:='create table ' ||'&table_name' ||'(sid int, sno int)';execute immediate create_table ;end;--案例02:使用execute immediate处理DDL语句---alterdeclarealter_table varchar2(200);beginalter_table:='alter table &target_table_name modify &column_name varchar2(10)'; execute immediate alter_table ;end;--案例03:使用execute immediate处理DDL语句---dropdeclaredrop_table varchar2(200);begindrop_table:='drop table ' ||'&target_table_name';execute immediate drop_table ;end;--案例04:使用execute immediate处理DDL语句--drop tablecreate or replace procedure drop_table (table_name varchar2)issql_sta varchar2(200);beginsql_sta:='drop table ' ||table_name;execute immediate sql_sta;end;--调用方法:exec drop_table('accp');--案例05:使用execute immediate处理DDL语句--create+selectdeclareselect_sta varchar2(200);emp_rec emp%rowtype;beginexecute immediate'create table sodi(sid int, sno int)';select_sta:='select * from emp where empno=:id';execute immediate select_sta into emp_rec using &1; /*使用占位符时,这个占位符是在引号内使用的*/end;---------------------------------------------------------1.2 使用execute immediate处理DCL语句------------------------------------------------------------案例01:使用execute immediate处理DCL语句--grantcreate or replace procedure grant_priv(priv varchar2, username varchar2)ispriv_stat varchar2(200);beginpriv_stat:=' grant '|| priv || ' to ' || username; --注意字符串和连接符之间的空格execute immediate priv_stat;end;--调用方法exec grant_priv('create session', 'scott');--案例02:使用execute immediate处理DCL语句--revokecreate or replace procedure revoke_priv(priv varchar2, username varchar2)ispriv_stat varchar2(200);beginpriv_stat:=' revoke '|| priv || ' from ' || username; --注意字符串和连接符之间的空格execute immediate priv_stat;--调用方法exec revoke_priv('create session', 'scott');----------------------------------------------------------------1.3.使用execute immediate处理DML语句----------------------------------------------------------------1.处理无占位符和return子句的DML语句--案例01:查询子句:selectdeclaresql_stat varchar2(100);beginsql_stat:='select * from emp';execute immediate sql_stat;end;--案例02:处理无占位符和return子句的DML语句--insertdeclareinsert_table varchar2(200);begininsert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;end;--案例03:处理无占位符和return子句的DML语句--updatedeclareupdate_table varchar2(200);beginupdate_table:='update &table_name set &column_name=&new_value '; execute immediate update_table;end;--案例06:处理无占位符和return子句的DML语句--deletedelete_table varchar2(200);begindelete_table:='delete from &table_name ';execute immediate delete_table;end;--案例05:新建一个表然后插入数据--create+insertdeclarecreate_table varchar2(200);begincreate_table:='create table &table_name(sid int, sno int)'; execute immediate create_table ;end;declareinsert_table varchar2(200);begininsert_table:='insert into &table_name values (&sid, &sno)'; execute immediate insert_table;end;--案例06:同时实现新建一个表并插入数据--create+insertdeclarecreate_table varchar2(200);insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)'; execute immediate create_table ;insert_table:='insert into &table_name values (&sid, &sno)'; execute immediate insert_table;end;--案例07:同时实现新建一个表并插入数据--create+insert+update/*这里也可以分开写*/declarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value'; execute immediate update_table;end;--案例08:同时实现新建一个表并插入数据--create+insert+update+deletedeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value'; execute immediate update_table;delete_table:='delete from &delete_tablename';execute immediate delete_table;end;--案例08:同时实现新建一个表并插入数据--create+insert+update+delete+insertdeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);re_insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &table_name values (&sid, &sno)';execute immediate insert_table;update_table:='update &table_name set &column_name=&new_value where sid=&old_value'; execute immediate update_table;delete_table:='delete from &delete_tablename';execute immediate delete_table;re_insert_table:='insert into &re_table_name values (&new_sid, &new_sno)';execute immediate re_insert_table;end;2.处理占位符的DML语句--案例01:处理占位符的DML语句:create+insertdeclarecreate_table varchar2(200);insert_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using &2,&3;end;--案例02:处理占位符的DML语句:create+insert_updatedeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using &1,&2;update_table:='update &update_tablename set &update_column_name=:new_value where &condition_column=:old_value ';execute immediate update_table using &3 ,&4;end;---ordeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);begincreate_table:='create table &新建的表名(sid int, sno int)';execute immediate create_table ;insert_table:='insert into &插入数据的表名values (:sid, :sno)';execute immediate insert_table using &sid的值,&sno的值;update_table:='update &被更新的表名set &更新的列名=:new_value where &条件列=:old_value ';execute immediate update_table using &新值,&条件列的值;end;--案例03:处理占位符的DML语句:create+update+insert+deletedeclarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using &1,&2;update_table:='update &update_tablename set &update_column_name=:new_value where &update_condition_column=:delete_condition_column_value ';execute immediate update_table using &3 ,&4;delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';execute immediate delete_table using &5;end;---执行过程:SQL> declarecreate_table varchar2(200);insert_table varchar2(200);update_table varchar2(200);delete_table varchar2(200);begincreate_table:='create table &table_name (sid int, sno int)';execute immediate create_table ;10 insert_table:='insert into &target_table_name values (:sid, :sno)';execute immediate insert_table using &1,&2;13 update_table:='update &update_tablename set &update_column_name=:new_value where &update_condition_column=:delete_condition_column_value ';execute immediate update_table using &3 ,&4;16 delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';execute immediate delete_table using &5;end;/输入table_name 的值: sz原值7: create_table:='create table &table_name (sid int, sno int)';新值7: create_table:='create table sz (sid int, sno int)';输入target_table_name 的值: sz原值10: insert_table:='insert into &target_table_name values (:sid, :sno)';新值10: insert_table:='insert into sz values (:sid, :sno)';输入1 的值: 101输入2 的值: 201原值11: execute immediate insert_table using &1,&2;新值11: execute immediate insert_table using 101,201;输入update_tablename 的值: sz输入update_column_name 的值: sid输入update_condition_column 的值: sno原值13: update_table:='update &update_tablename set &update_column_name=:new_ value where &update_condition_column=:delete_condition_column_value ';新值13: update_table:='update sz set sid=:new_value where sno=:delete_condition_column_value ';输入3 的值: 1001输入4 的值: 201原值14: execute immediate update_table using &3 ,&4;新值14: execute immediate update_table using 1001 ,201;输入dele_table_name 的值: sz输入delete_condition_column 的值: sno原值16: delete_table:='delete from &dele_table_name where &delete_condition_column=:delete_condition_column_value';新值16: delete_table:='delete from sz where sno=:delete_condition_column_value';输入5 的值: 201原值17: execute immediate delete_table using &5;新值17: execute immediate delete_table using 201;PL/SQL 过程已成功完成。
MyBatis动态SQL的执行原理:灵活应对MyBatis 是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的XML 或注解来配置和映射原生信息,将接口和Java 的 POJOs (Plain Old Java Objects) 映射成数据库中的记录。
关于 MyBatis 动态 SQL 的执行原理,我们可以从以下几个方面来理解:1.XML 映射文件:MyBatis 的核心是它的 XML 映射文件。
这些文件描述了如何执行 SQL 查询和更新,并将结果映射回 Java 对象。
XML 文件中可以包含动态SQL,例如<if>、<choose>、<when>、<otherwise>、<foreach>等元素,这些元素可以根据提供的参数或条件动态地生成SQL 语句。
2.参数解析:当MyBatis 接收到一个查询请求时,它会首先解析提供的参数。
参数类型可以是一个单一的参数,也可以是一个参数数组。
MyBatis 会根据参数的类型和属性值来决定如何构建 SQL 语句。
3.动态 SQL:动态 SQL 是根据传入的参数或条件构建的 SQL 语句。
例如,可以根据传入的ID 来查询特定的记录,或者根据提供的多个ID 来查询多个记录。
MyBatis 的动态 SQL 功能允许开发者根据不同的条件构建不同的SQL 语句,而不需要在代码中编写多个几乎相同的 SQL 语句。
4.SQL 执行:一旦 MyBatis 构建了 SQL 语句,它就会使用 JDBC 将该语句发送到数据库执行。
执行的结果会被映射回 Java 对象,然后返回给调用者。
5.结果映射:MyBatis 使用结果映射来将数据库中的记录映射到 Java 对象。
它可以根据列名和属性名进行自动映射,也可以通过定义<resultMap>来指定如何映射列和属性。
三、动态SQL动态SQLMyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们⽅便的在SQL语句中实现某些逻辑。
动态SQL的元素元素作⽤备注if判断语句单条件分⽀判断choose、when、otherwise相当于Java中的switch case when语句多条件分⽀判断trim、where、set辅助元素⽤于处理⼀些SQL拼装问题foreach循环语句在in语句等列举条件常⽤ifif元素相当于Java中的if语句,它常常与test属性联合使⽤。
现在我们要根据name去查找学⽣,但是name是可选的,如下所⽰:<select id="selectByName" resultType="com.zl.domain.StudentDomain">SELECT * FROM studentWHERE 1=1<if test="name != null and name != ''">AND name LIKE concat('%', #{name}, '%')</if></select>choose、when、otherwise有些时候我们还需要多种条件的选择,在Java中我们可以使⽤switch、case、default语句,⽽在映射器的动态语句中可以使⽤choose、when、otherwise元素。
<!-- 有name的时候使⽤name搜索,没有的时候使⽤id搜索 --><select id="select" resultType="com.zl.domain.StudentDomain">SELECT * FROM studentWHERE 1=1<choose><when test="name != null and name != ''">AND name LIKE concat('%', #{name}, '%')</when><when test="id != null">AND id = #{id}</when></choose></select>where上⾯的select语句我们加了⼀个1=1的绝对true的语句,⽬的是为了防⽌语句错误,变成SELECT * FROM student WHERE这样where后没有内容的错误语句。
动态SQL四种类型的语句格式1.Dynamic SQL Format 1EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ; eg:string MysqlMysql = "CREATE TABLE Employee "&+"(emp_id integer not null,"&+"dept_id integer not null, "&+"emp_fname char(10) not null, "&+"emp_lname char(20) not null)"EXECUTE IMMEDIATE :Mysql ;2.Dynamic SQL Format 2PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;EXECUTE DynamicStagingArea USING {ParameterList} ;eg:INT Emp_id_var = 56PREPARE SQLSAFROM "DELETE FROM employee WHERE emp_id=?" ;EXECUTE SQLSA USING :Emp_id_var ;3.Dynamic SQL Format 3DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;OPEN DYNAMIC Cursor {USING ParameterList} ;EXECUTE DYNAMIC Procedure {USING ParameterList} ;FETCH Cursor | Procedure INTO HostVariableList ;CLOSE Cursor | Procedure ;eg:integer Emp_id_varDECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;PREPARE SQLSA FROM "SELECT emp_id FROM employee" ;OPEN DYNAMIC my_cursor ;FETCH my_cursor INTO :Emp_id_var ;CLOSE my_cursor ;4.Dynamic SQL Format 4DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea ;OPEN DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;EXECUTE DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;FETCH Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;CLOSE Cursor | Procedure ;eg:string Stringvar, Sqlstatementinteger IntvarSqlstatement = "SELECT emp_id FROM employee" PREPARE SQLSA FROM :Sqlstatement ;DESCRIBE SQLSA INTO SQLDA ;DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ; OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ; FETCH my_cursor USING DESCRIPTOR SQLDA ;// If the FETCH is successful, the output// descriptor array will contain returned// values from the first row of the result set. // SQLDA.NumOutputs contains the number of// output descriptors.// The SQLDA.OutParmType array will contain// NumOutput entries and each entry will contain // an value of the enumerated data type ParmType // (such as TypeInteger!, or TypeString!). CHOOSE CASE SQLDA.OutParmType[1]CASE TypeString!Stringvar = GetDynamicString(SQLDA, 1)CASE TypeInteger!Intvar = GetDynamicNumber(SQLDA, 1)END CHOOSECLOSE my_cursor ;。