动态SQL

PL/SQL开发中动态sql的使用

拈花ヽ惹草 提交于 2020-04-11 15:00:11
在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如: SELECT t.empno,t.ename FROM scott.emp t WHERE t.deptno = 20; 但有的时候,从应用的需要或程序的编写出发,都可能需要用到动态SQl,如: 当 from 后的表 不确定时,或者where 后的条件不确定时,都需要用到动态SQL。 一、使用动态游标实现 1、声明动态游标 TYPE i_cursor_type IS REF CURSOR; 2、声明游标变量 my_cursor i_cursor_type; 3、使用游标 n_deptno:=20; dyn_select := 'select empno,ename from emp where deptno='||n_deptno; OPEN my_cursor FOR dyn_select; LOOP FETCH my_cursor INTO n_empno,v_ename; EXIT WHEN my_cursor%NOTFOUND; --用n_empno,v_ename做其它处理 --.... END LOOP; CLOSE dl_cursor; 4、小结:动态游标可以胜任大多数动态SQL的需求了,使用简洁方便居家旅行之必备杀人放火之法宝。 二、使用 EXECUTE

关于mybatis 动态 sql 的一些陷阱:防止批量update,delete,select...

谁说胖子不能爱 提交于 2019-11-30 07:26:12
问题产生场景: 昨天支付中心发起退款回调时,引起了我们这边一个bug: 有两笔退款异常,支付中心发起第一笔异常的回调的时候就把我们这边两笔退款异常对应的订单的状态全部给修改 了。当支付中心对第二笔异常回调的时候回调程序发现订单状态已经改变发出了一个异常邮件,然后回调就终止 了,所以数据库呈一个不一致状态:订单状态已改变,但没有记录订单日志,也没有记录退款状态。然后大家就来寻找这个bug,过程挺有意思的。 首先我们请DBA从订单号,订单Id和时间多个条件查数据库的日志,想找出是哪个系统发出的这个更新订单状态的log,最后没找到。 后来从退款回调里发现下面的代码: checkUpdateResult(updateDAO.execute( "order.updateStatus", ImmutableMap.of("orderId", order.getId(), "updateTs", TsUtils.now(), "preStatus", currStatus.getStatus(), "currentStatus",nextStatus.getStatus())) ) 这是用于更新订单状态的代码,传入了参数 orderId, updateTs,preStatus对应的mybatis mapper: <update id="updateStatus" parameterType=

JFinal教程JfinalUIB 代码笔记 (4)--- 高仿mybatis的sql的集中管理

老子叫甜甜 提交于 2019-11-29 07:14:07
实现sql的集中管理,简单的把一些固定长度的sql移植进xml很简单,这没有什么好多说的,关键问题是我们平时处理的sql,有大量是动态长度的,比如说最常见的就是多条件的分页查询,往往我们会在代码中写大量的if else,想把这些移植进xml就比较困难了,完全仿制ibatis来做xml标签工作量太大,最省事的处理方法就是能不能直接把Java代码的逻辑处理方式移植进xml,然后对逻辑代码进行解析,绕开那一大堆的xml标签定义,下面就是jfinaluib中的处理方式: 1.0 暂时还是用的拼接,没有预处理,难点就是不是做到解析sql中表字段的类型对应的Java数据类型 <?xml version="1.0" encoding="UTF-8"?> <sql-statement namespace="pingtai.user"> <!-- 动态SQL处理 --> <sql id="splitPage"> <![CDATA[ from pt_user u left join pt_userinfo ui on u.userinfoids = ui.ids left join pt_department d on u.departmentids = d.ids where 1=1 <% if(!isEmpty(userClass)){ %> and u.userClass = '

Mybatis3.4.x技术内幕(十八):Mybatis之动态Sql设计原本(下)

无人久伴 提交于 2019-11-28 12:55:49
上一篇博文中,简要介绍了Mybatis动态sql的基本用法和基本设计结构,本篇博文重点阐述一些动态sql的技术细节, #{name}和${name}的区别 ,将在本篇博文中揭晓。也许读者早已了解它们之间的区别,但是,作为技术内幕,我们不仅要了解它们的区别,还要介绍它们的工作原理,是不是很开森呢? 1. #{name}和${name}的区别。 #{name}:表示这是一个参数(ParameterMapping)占位符,值来自于运行时传递给sql的参数,也就是XXXMapper.xml里的parameterType。其值通过PreparedStatement的setObject()等方法赋值。 动态sql中的<bind>标签绑定的值,也是使用#{name}来使用的。 #{name}用在sql文本中。 ${name}:表示这是一个属性配置占位符,值来自于属性配置文件,比如jdbc.properties,其值通过类似replace方法进行静态替换。比如${driver},将被静态替换为com.mysql.jdbc.Driver。 ${name}则可以用在xml的Attribute属性,还可以用在sql文本当中。 <select id="countAll" resultType="${driver}"> select count(1) from ( select stud_id as

Mybatis3.4.x技术内幕(十七):Mybatis之动态Sql设计原本(上)

匆匆过客 提交于 2019-11-28 12:55:32
上一篇博文中,介绍了可复用的sql片段,通过<include>标签进行引入,而<include>标签内一般存放的是静态sql,其实,sql片段也是可以放置动态sql标签内容。 1. Mybatis支持的动态sql及基本用法 org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.nodeHandlers(String)部分源码。 NodeHandler nodeHandlers(String nodeName) { Map<String, NodeHandler> map = new HashMap<String, NodeHandler>(); map.put("trim", new TrimHandler()); map.put("where", new WhereHandler()); map.put("set", new SetHandler()); map.put("foreach", new ForEachHandler()); map.put("if", new IfHandler()); map.put("choose", new ChooseHandler()); map.put("when", new IfHandler()); map.put("otherwise", new OtherwiseHandler(

MyBatis基础学习:动态SQL和SQL语句构建器类

微笑、不失礼 提交于 2019-11-27 10:12:06
Mybatis介绍 MyBatis( http://www.mybatis.org/ ) 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 动态 SQL 作用 MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。 if 动态 SQL 通常要做的事情是有条件地包含