Oracle的SQL学习笔记

oracle sequence

  • 什么是sequence

在Oracle数据库中,什么是序列呢?其中的作用是什么呢?其实sequence是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。其主要的用途是生成表的主键值,可以在插入语句中引用,在插入之前,获取序列号nextval值,然后进行插入。也可以通过查询检查当前值,或使序列增至下一个值。

  • 如何定义一个sequence
create sequence INR_REQUIRMENT_SQUENCE    
INCREMENT BY 1 -- 每次加几个  
START WITH 1 -- 从1开始计数  
NOMAXVALUE -- 不设置最大值  
NOCYCLE -- 一直累加,不循环  
CACHE 10;  --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---NOCACHE
  • 如何获取一个sequence的值?

SELECT INR_REQUIRMENT_SQUENCE.CURRVAL FROM dual –获取当前的sequence的值,第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值, 然后返回增加后的值。CURRVAL 总是返回当前sequence的值,但是在第一次NEXTVAL 初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次sequence的值, 所以如果你在同一个语句里面使用多个NEXTVAL。

<select id="getSeq" resultType="string">
    select cast(TAB_VIP_导出记录表_SEQ.nextval as varchar2(50)) from dual
</select>
  • 可以在哪些地方使用Sequence
  • 不包含子查询、snapshot、VIEW的 SELECT 语句
  • INSERT语句的子查询中
  • NSERT语句的VALUES中
  • UPDATE 的 SET中

在实际开发中,比如一个表中的主键需要先得到主键ID,可以用NEXTVAL来获下一个取序列值,然后再进行其他操作。

  • 如何删除Sequence

DROP sequence policy_id_seq; –policy_id_seq为sequence的名字,如果要改变sequence中的初始值,必须先删除序列号然后再进行创建。你或者是该sequence的owner,或者有ALTER ANY sequence权限才能改动sequence,直接用Alter语句进行sequence的更新。

oracle to_date()函数

  • 介绍

在使用Oracle的to_date函数来做日期转换时,很多Java程序员也许会直接的采用“yyyy-MM-dd HH:mm:ss”的格式作为格式进行转换,但是在Oracle中会引起错误:“ORA 01810 格式代码出现两次”。

如:select to_date(‘2005-01-01 13:14:20’,’yyyy-MM-dd HH24:mm:ss’) from table;
原因是SQL中不区分大小写,MM和mm被认为是相同的格式代码,所以Oracle的SQL采用了mi代替分钟。
例如: select to_date(‘2005-01-01 13:14:20’,’yyyy-MM-dd HH24:mi:ss’) from table;

  • 用法一
SELECT "网点名称","回收时间",to_date("回收时间",'yyyy-MM-dd hh24:mi:ss') as mytime
FROM vip_回收清单表 
  • 用法二
<if test="start != null and '' != start">
     AND ORDER_DATE >= to_date(#{start},'yyyy-MM-dd hh24:mi:ss')
 </if>
 <if test="end != null and '' != end">
       AND ORDER_DATE &lt;= to_date(#{end},'yyyy-MM-dd hh24:mi:ss')
 </if>

oracle hint

存储在数据库中数据的分布情况开发人员或管理员比Oracle优化器更加的清楚,在优化器不能作出最有查询路径选择的情况下,使用HINT(提示)人为的固定查询路径,一定程度能生成更优的执行计划。

用到别名时,/*+INDEX(TABLE INDEX_NAME)*/中的TABLE一定是别名,否则不走执行强制索引。

    select /*+INDEX(t IDX_SEL_ADD_DATE)*/  count(1)  
     from std_entp_login t  
    where t.add_date >  
                  to_date('2010-12-28 00:00:00', 'yyyy-mm-dd hh24:mi:ss')  
              and t.add_date <  
                  to_date('2010-12-28 23:59:59', 'yyyy-mm-dd hh24:mi:ss')  
    group by t.own_sys  
  • 模糊查询
    where cusname like ‘%’ || #{cusname} || ‘%’ or cuscode like ‘%’ || #{cusname} || ‘%’

Oracle的NVL函数用法

  • 语法

    NVL(eExpression1, eExpression2)

  • 参数

    eExpression1, eExpression2

如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。

  • 示例
select nvl(rulescore,0) from zwjc_graderule where rulecode='FWTD'

Oracle递归查询

  • 语法
    select…start with…connect by…prior

  • 示例

SELECT siteName
FROM tab_business_network
Start WITH cusId = #{cusId}
Connect By Prior siteName = belongSite

— 参考文档
1. http://qianyiyiding.iteye.com/blog/2303176

猜你喜欢

转载自blog.csdn.net/thebigdipperbdx/article/details/80420751