GVKun编程网logo

如何在Teradata中执行动态SQL(teradata create table)

3

如果您对如何在Teradata中执行动态SQL和teradatacreatetable感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何在Teradata中执行动态SQL的各种细节,并对ter

如果您对如何在Teradata中执行动态SQLteradata create table感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何在Teradata中执行动态SQL的各种细节,并对teradata create table进行深入的分析,此外还有关于Mybatis动态sql有什么用?执行原理?有哪些动态sql?、MyBatis执行动态SQL的方法、mybatis执行动态sql语句、Mybatis的动态sql是做什么的呢?都有哪些动态sql? 简述一下动态sql的执行原理是什么?的实用技巧。

本文目录一览:

如何在Teradata中执行动态SQL(teradata create table)

如何在Teradata中执行动态SQL(teradata create table)

有什么方法可以将动态生成的SQL提交给Teradata?我编写了一个查询,该查询将创建用于对表进行非规范化的代码。现在,我将代码放到客户端(SAS)中,然后在第二步中重新提交。我对Teradata宏或过程不熟悉;这样的事情行得通吗?

为了说明这一点,我有一个定义如下的表:

create multiset table MYTABLE
    (  RECID  integer generated always as identity
              ( start with 1
               increment by 1
               minvalue -2147483647
               maxvalue 2147483647
               no cycle ),SNAP_DATE  date format 'YYYY/MM/DD',EMAIL_DATE date format 'YYYY/MM/DD',FREQ integer
    )
unique primary index ( RECID  )

该表每天(SNAP_DATE)填充一次,用于监视另一个表中对email_date的更改。以下查询返回我可以运行以创建我的非规范化视图的代码:

select RUN_THIS
from (
    select RUN_THIS,RN
    from (
        select 'select EMAIL_DATE ' (varchar(100)) as RUN_THIS,0 (int) as RN
          ) x

    union all
    select ',sum( case when SNAP_DATE = date '''
             || (SNAP_DATE (format 'yyyy-mm-dd') (char(10)) )
             || ''' then FREQ else 0 end ) as D'
             || (SNAP_DATE (format 'yyyymmdd') (char(8)) ) as RUN_THIS,row_number() over ( partition by 1 order by SNAP_DATE ) as RN
    from ( select distinct SNAP_DATE 
           from MYTABLE 
           where SNAP_DATE > current_date - 30) t1

    union all
    select RUN_THIS,RN
    from (
        select 'from MYTABLE group by 1 order by 1;' as RUN_THIS,10000 as RN
          ) y
    ) t
order by RN

我将上述查询的结果导出到客户端上的文件,然后转身将该文件提交回Teradata。我希望有某种方法可以将完整的定义存储在某些Teradata对象中,以便可以直接执行。

Mybatis动态sql有什么用?执行原理?有哪些动态sql?

Mybatis动态sql有什么用?执行原理?有哪些动态sql?

         Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql执行原理是根据表达式的值完成逻辑判断并动态拼接sql的功能。Mybatis提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。

MyBatis执行动态SQL的方法

MyBatis执行动态SQL的方法

今天小编就为大家分享一篇关于MyBatis执行动态sql的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

大家基本上都知道如何使用 MyBatis 执行任意 sql,使用方法很简单,例如在一个 XXMapper.xml 中:

${_parameter}

你可以如下调用:

sqlSession.selectList("executesql", "select * from sysuser where enabled = 1");

或者你可以在 XXMapper.java 接口中定义如下方法:

List executesql(String sql);

然后使用接口调用方法:

xxMapper.executesql("select * from sysuser where enabled = 1");

上面这些内容可能都会,下面在此基础上再复杂一点。

假如像上面sql中的enabled = 1我想使用参数方式传值,也就是写成enabled = #{enabled},如果你没有遇到过类似这种需求,可能不明白为什么要这么写,举个例子,要实现一种动态查询,可以在前台通过配置 sql,提供一些查询条件就能实现一个查询的功能(为了安全,这些配置肯定是开发或者实施做的,不可能让用户直接操作数据库)。

针对这个功能,使用 MyBatis 实现起来相当容易。配置 sql 肯定要执行,用上面讲的这种方式肯定可以执行 sql,如何提供参数呢?参数就是enabled = #{enabled}中的#{enabled}部分。如果再多一些条件,一个配置好的 sql 如下:

select * from sysuser where enabled = #{enabled} and userName like concat('%',#{userName},'%')

这种情况下,该怎么用 MyBatis 实现呢?

首先 XML 中修改如下:

${sql}

接口中的方法修改为:

List executesql(Map map);

然后调用方法:

Map map = new HashMap(); //这里的 sql 对应 XML 中的 ${sql} map.put("sql", "select * from sysuser " + " where enabled = #{enabled} " + " and userName like concat('%',#{userName},'%')"); //#{enabled} map.put("enabled", 1); //#{userName} map.put("userName", "admin"); //接口方式调用 List list = xxMapper.executesql(map); //sqlSession方式调用 sqlSession.selectList("executesql", map);

有了这个sql之后,就可以将 enabled 和 userName 作为条件提供给用户。这两个条件显然是必填的。如果是可选的,那该怎么写?

也许有人想到了是不是可以用 MyBatis 中的动态 sql,使用标签等等?

再回答这个问题前,我们先看处理动态 sql 的DynamicsqlSource中的代码:

@Override public Boundsql getBoundsql(Object parameterObject) { DynamicContext context = new DynamicContext(configuration, parameterObject); rootsqlNode.apply(context); sqlSourceBuilder sqlSourceParser = new sqlSourceBuilder(configuration); Class >parameterType = parameterObject == null ? Object.class: parameterObject.getClass(); sqlSource sqlSource = sqlSourceParser.parse(context.getsql(), parameterType, context.getBindings()); Boundsql boundsql = sqlSource.getBoundsql(parameterObject); for (Map.Entry entry: context.getBindings().entrySet()) { boundsql.setAdditionalParameter(entry.getKey(), entry.getValue()); } return boundsql; }

MyBatis 处理动态 sql 时,所有动态 sql 的标签都会处理为 sqlNode (这里的rootsqlNode)对象,包含${}的也会处理为TextsqlNode对象,在上面方法的前两行,就是 MyBatis 处理动态 sql 的地方。

${sql} 中的内容包含嵌套的${}和,等标签时,他们在 MyBatis 解析 XML 为 sqlNode 对象时,XML 元素包含的内容只有${sql},只有${sql}会被解析,在运行时这个参数字符串中可能包含的${}和,等标签,但是这都发生在 MyBatis 解析后,因此当这些内容作为字符串中的一部分出现时,他们不会被特殊处理,他们只是sql中的一部分,只是原样输出(由于数据库不认会报错)无法被处理,因此没法通过 MyBatis 自带的这种方式来写动态 sql。

提示

在上面的代码中:

sqlSourceParser.parse(context.getsql(), parameterType, context.getBindings());

这一段代码是处理动态参数(#{})的

这个处理在动态 sql 处理之后,

因此可以在 sql 中使用这种类型的参数。

既然不能用 MyBatis 动态 sql 方式,该怎么实现动态 sql 呢?

这里提供一个简单的思路,在 sql 中使用模板标记语言来实现动态sql(例如freemarker),在 sql 交给 MyBatis 执行之前,使用模板对 sql 进行处理生成最终执行的 sql(需要避免处理#{}参数),将这个sql交给 MyBatis 执行。

举一个Freemarker模板的例子,仍然以上面的sql为基础:

select * from sysuser where 1 = 1 enabled = #{enabled} #if> and userName like concat('%',#{userName},'%') #if>

注意,这里的是Freemarker的元素。在不考虑sql注入的情况下,上面的sql还可以写成:

select * from sysuser where 1 = 1 enabled = #{enabled} #if> and userName like '%${userName}%' #if>

区别就是'%${userName}%',因为 Freemarker 也会处理${userName},也会用实际的值来替换这里的参数。

在前面调用的代码中,这里修改如下:

//#{enabled} map.put("enabled", 1); //#{userName} map.put("userName", "admin"); //这里的 sql 对应 XML 中的 ${sql} String sql = "上面两个复杂sql中的一个"; //使用Freemarker处理sql sql = processsqlByFreemarker(sql, map); //将处理后的sql放到map中 map.put("sql", sql); //执行方法 List list = xxMapper.executesql(map);

注:processsqlByFreemarker方法就是根据map中的数据来处理sql字符串,实现方式可以自己搜索。

到这里,一个不是很复杂的动态sql功能就实现了。

不知道有没有更贪心的人,你会不会想,上面返回值都是List类型,能不能返回一个我指定的实体类呢?

例如在map中:

map.put("class", "tk.mybatis.model.SysUser");

能不能通过这种方式让返回值变成SysUser类型呢?由于这篇文章耗时已经太长,这里就提供一个方案,不深入。

你可以使用拦截器实现,获取MappedStatement后,复制一份,然后修改resultMaps中resultMap的type属性为你指定的class类型就能实现,说起来容易,实际操作起来能有 pageHelper 分页插件 1/10 左右的工作量。

注:如果是动态的update,insert,delete 语句,可以将上面的改为(不需要使用和),返回值用int,比select的情况容易很多。

总结

mybatis执行动态sql语句

mybatis执行动态sql语句

mybatis执行动态sql语句


Mybatis执行任意sql 在mapper.xml中写入

	<select id="executeSql" resultType="map">
		${_parameter}
	</select>

调用

	sqlSession.selectList("executeSql", "select * from sysuser where enabled = 1");

或者使用

	//定义接口
	List<Map> executeSql(String sql);
	//然后接口调用方法
	xxMapper.executeSql("select * from sysuser where enabled = 1");

Mybatis传入参数执行动态sql

...

Mybatis的动态sql是做什么的呢?都有哪些动态sql? 简述一下动态sql的执行原理是什么?

Mybatis的动态sql是做什么的呢?都有哪些动态sql? 简述一下动态sql的执行原理是什么?

Mybatis的动态sql是做什么的呢?都有哪些动态sql? 简述一下动态sql的执行原理是什么?

答:Mybatis的动态sql就是根据入参动态组装sql语句。

​ 常用的动态sql有以下几种:

  • if
<select id="findOrderByName"
     resultType="Order">
  SELECT * FROM `order`
  WHERE state = ''COMPLETE''
  <if test="name != null">
    AND name=#{name}
  </if>
</select>
  • choose、when 、otherwise
<select id="findOrderByName"
     resultType="order">
  SELECT * FROM `order` WHERE state = ''COMPLETE''
  <choose>
    <when test="name != null">
      AND name = #{name}
    </when>
    <when test="user != null and user.id != null">
      AND user.id = #{user.id}
    </when>
  </choose>
</select>
  • trim、where、set

请看下面的sql语句

<select id="findOrderByOrderNo"
     resultType="Order">
  SELECT * FROM `order`
  WHERE
  <if test="orderNo != null">
    AND order=#{orderNo}
  </if>
</select>

如果上面的orderNo不为null,则最终得到的sql为:

SELECT * FROM `order` WHERE AND order=?

这会导致查询失败。可以使用where元素,where元素会去掉开头的"AND"和"OR",如下:

<select id="findOrderByOrderNo"
     resultType="Order">
  SELECT * FROM `order`
  <where>
      <if test="orderNo != null">
        AND order=#{orderNo}
      </if>
  </where>  
</select>
  • foreach

foreach元素可以用来执行批量(插入、更新、查询)操作。

<select id="findOrderByIds" resultType="Order">
  SELECT *
  FROM `order` 
  WHERE id in
  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

它的执行原理:使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接SQL.

Mybatis中一些关于动态SQL的一些源码:

SqlNode接⼝,简单理解就是xml中的每个标签,⽐如sql的update,if标签:

public interface SqlNode {
	boolean apply(DynamicContext context);
}

SqlSource Sql源接⼝,代表从xml⽂件或注解映射的sql内容,主要就是⽤于创建BoundSql:

public interface SqlSource {
BoundSql getBoundSql(Object parameterObject);
}

BoundSql类,封装mybatis最终产⽣sql的类,包括sql语句,参数,参数源数据等参数:

BaseBuilder接口实现类XMLScriptBuilder 负责解析xml中各个节点sql部分的Builder。

XMLScriptBuilder#initNodeHandlerMap包括的动态sql:

 private void initNodeHandlerMap() {
    nodeHandlerMap.put("trim", new TrimHandler());
    nodeHandlerMap.put("where", new WhereHandler());
    nodeHandlerMap.put("set", new SetHandler());
    nodeHandlerMap.put("foreach", new ForEachHandler());
    nodeHandlerMap.put("if", new IfHandler());
    nodeHandlerMap.put("choose", new ChooseHandler());
    nodeHandlerMap.put("when", new IfHandler());
    nodeHandlerMap.put("otherwise", new OtherwiseHandler());
    nodeHandlerMap.put("bind", new BindHandler());
  }

今天关于如何在Teradata中执行动态SQLteradata create table的讲解已经结束,谢谢您的阅读,如果想了解更多关于Mybatis动态sql有什么用?执行原理?有哪些动态sql?、MyBatis执行动态SQL的方法、mybatis执行动态sql语句、Mybatis的动态sql是做什么的呢?都有哪些动态sql? 简述一下动态sql的执行原理是什么?的相关知识,请在本站搜索。

本文标签: