Oracle 使用小计(4)
1.oracle字符串分割函数split
)定义split_type类型:
)定义split函数:
- )
- RETURN split_type
- j INT := 0;
- i INT := 1;
- len INT := 0;
- len1 INT := 0;
- str VARCHAR2 (4000);
- my_split split_type := split_type ();
- len := LENGTH (p_str);
- len1 := LENGTH (p_delimiter);
- WHILE j < len
- LOOP
- j := INSTR (p_str, p_delimiter, i);
- IF j = 0
- j := len;
- str := SUBSTR (p_str, i);
- my_split.EXTEND;
- my_split (my_split.COUNT) := str;
- IF i >= len
- EXIT;
- str := SUBSTR (p_str, i, j - i);
- i := j + len1;
- my_split.EXTEND;
- my_split (my_split.COUNT) := str;
- END LOOP;
- RETURN my_split;
- END split;
)测试split函数:
出处: http://www.chinasb.org/archives/2011/02/1442.shtml#viewSource
2.循环控制结构语句
2.1.基本循环
- LOOP
- statement1;
- ......
- END LOOP;
EG:
2.2 while循环
EG:
2.3 for循环
- statement1;
- statement2;
- .......
- END LOOP;
counter是循环控制变量,并且该变量由oracle隐含定义,不需要显式定义。lower_bound和upper_bound分别对应于循环控制变量的下界值和上界值,默认情况下,当使用FOR循环时,每次循环时循环控制变量会自动增1.如果指定REVERSE选项,那么每次循环时循环控制变量会自动减1.
EG:
3.分支控制结构
- –情形1
- ......
- –情形2
- ......
- ......
- –情形3
- ......
- ELSIF CONDITION2 THEN
- ......
- ELSIF CONDITION3 THEN
- ......
4.instr函数
语法: instr( string1, string2 [, start_position [, nth_appearance ] ] ) 参数: string1 源字符串,要在此字符串中查找。 string2 要在string1中查找的字符串。 start_position 代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1。字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。 nth_appearance 代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。 返回值: string2在string1中的第一个字母的位置。如果String2在String1中没有找到,则返回0。 |
EG:Freq=day;中的等号位置
INSTR(TT.COLUMN_VALUE,'=',1,1)
5.substr函数
语法: substr( string, start_position, [ length ] ) 参数: string:源字符串 start_position:要截取的子串的开始位置。为负数表示从源字符串的末尾开始匹配。 length:要截取的字符的长度。不填表示到源字符串的末尾。 示例:Freq=day;,获取day。 SUBSTR(TT.COLUMN_VALUE,INSTR(TT.COLUMN_VALUE,'=',1,1)+1) |
6.日期函数
6.1日期相加
计算基准:1天为1个单位。add_months(sysdate,12)
- add_months(sysdate,12)
以上分别加一周、一天、一小时、一分钟。加一个月。
另外指定计算:
以上分别加两(秒,分,时,天,月,年)。
6.2 日期格式表
格式 |
含义 |
yyyy |
yyyy 用4位数表示年 |
mm |
表示两位的月 |
dd |
表示当月的第几天 |
hh |
表示12小时的时间 |
hh24 |
表示24小时制的时间 |
mi |
表示2位数的分钟 |
ss |
表示2位数的秒 |
ddd |
表示当年的第几天 |
dy |
表示当周的第几天 |
q |
季度(1-4) |
以上格式就可以在to_char和to_date中使用。
6.3相差计算
计算基准:默认时间相减获得相差的天数。
- select To_date('2015-07-17 13:31:00' , 'yyyy-mm-dd hh24-mi-ss') -
- To_date('2015-07-17 13:31:50' , 'yyyy-mm-dd hh24-mi-ss') 相差天数 FROM DUAL;
7.判断日期部分相等(同一天)
TRUNC(TO_DATE(TMP_DT,'yyyy-mm-dd')-TO_DATE(SYSDATE,'yyyy-mm-dd')) = 0
8.select into 与insert into语句
SELECT vale1, value2 into Table2 from Table1 要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中,请注意vale1,vale2一定要是Table1有的字段,否则就会出错 Insert into Table2(field1,field2,...) select value1,value2,... from Table1 插入数据的另一种形式 |
9.插入一条数据,并返回主键
- RETURNING 列名 INTO 变量;
10. ORA-04091: table xxx is mutating, trigger/function may not see it
参考:http://www.cnblogs.com/dingyingsi/archive/2013/10/09/3358675.html
触发器访问所依赖的table规则:
- 对于after 类型的 for each row 级别的triggers,不论哪种insert语句触发了trigger,都不允许在 trigger 中访问本trigger所依赖的table的;
- 对于before 类型的 for each row 级别的triggers,如果使用 insert into ... values 语句触发此trigger ,则在trigger 中访问本table没有问题;
但如果使用 insert into select .. from 语句触发此trigger ,则在trigger 中访问本table就报ora-04091错误;
所以,如果有insert into select ...from语句的,可以使用表变量来改进
11.复合数据类型值Index-By表
index_by表或则PL/SQL表,其数据结构模型为hash表。
主要是通过键值的方式访问。key是binary_interger;value为任意类型。
其定义语法如下:
type 表类型名 is table of 类型 index by binary_integer;
表变量名 表类型;
EG:
- TABLE1 TABLETYPE1;
其中,TASK_USER为数据库中一个表。
类型可以是number 、varchar2、date 等数据类型,index by binary_integer 子句代表以符号整数为索引,这样访问表类型变量中的数据方法就是"表变量名(索引符号整数)"。
示例1:定义值为单一数据类型的Index-By表。
- --value 为varchar2(10) 类型
- table1 tabletype1;
- --value 为TASK表中CODE字段的类型
- table2 tabletype2;
- table1(1) := '大学'; --通过键 1 访问
- table1(2) := '大专';
- table2(1) := '';
- table2(2) := ''; --通过键 2 访问
- END;
注:下面的程序定义了名为tabletype1和tabletype2的两个Index-By表。table1和table2分别是两种表类型变量。
示意图:
示例2:定义一个值为TASK表类型的Index-By表。
- T1 TABLETYPE1;
- dbms_output.put_line(T1(1).USER_TYPE);
- END;
注意:一定要使用索引,比如T1(1),如果写成T1则不行,访问的时候也一样。
示意图:
参考:http://www.linuxidc.com/Linux/2010-08/27830.htm
12. In和Exist
exits性能高于In只需要有1条存在即可,无需检索子查询的所有记录。
在写SQL的时候,适当把IN改为exists
且exist可以用于多个字段的比较。
Oracle 使用小计(4)的更多相关文章
- Oracle分组小计、总计示例(grouping sets的使用)
1.首先创建一个表 create table TE ( ID VARCHAR2(2), T_CODE VARCHAR2(4), T_NAME VARCHAR2(4), T_A ...
- Oracle 使用小计(3)
1.出错处理 ORA-00911: invalid character. 这是因为在语句末尾加上了";"的缘故,去掉";"SQL就可以执行了~ (这与SQL ...
- Oracle 使用小计(2)
1.时间转换 1.1 字符串转时间 今天需要写SQL语句更新数据库的时间,按照SQL Server的习惯写成 UPDATE TABLE A ’ WHERE ORDER_ID = ‘A12345678’ ...
- Oracle 使用小计
1.Sequence 1.1 什么是Sequence? Sequence是oracle提供的一个对象,用于产生自增的主键.这与sql server的identity是类似的. 从数学的角度来说,其为一 ...
- 使用EF操作Oracle数据库小计
1.建表 CREATE TABLE item.ORDERS( ORDERID ) CONSTRAINT PK_ORDERS PRIMARY KEY, ORDERNO ), STOREID ), STO ...
- oracle操作小计
1.查询oracle的连接数 select count(*) from v$session; 2.查询oracle的并发连接数 select count(*) from v$session where ...
- oracle 报表带小计合计
selectcase when (grouping(glbm)=1) then '合计' else DECODE(glbm,null,'',glbm) end glbm,case when (grou ...
- oracle group by rollup实现小计、合计
SQL合计汇总实现数据N+1条显示: 注意group by rollup((ename, job, empno))!!! select decode(grouping(ename) + groupin ...
- oracle学习小知识点总结
登陆数据库:sqlplus "/as sysdba" window身份验证,不需要用户名和密码. 查看数据库状态: select status from v$instance(v$ ...
随机推荐
- Android中通过反射获取资源Id
package com.cp.utils; import android.content.Context; public class CPResourceUtil { public static in ...
- 安装oracle 10g RAC执行的几个脚本说明
1,/u01/app/oracle/oraInventory/orainstRoot.sh 脚本 #!/bin/sh if [ -d "/etc" ]; then /etc; fi ...
- 玩转SSRS第九篇---匿名访问的一个间接方法
SSRS是一个功能丰富的报表平台,我们可以在这个平台上实现各种不同需求的报表应用,所以这个平台也吸引了很多.net框架之外的技术,希望能在应用中引入SSRS的报表,比如JSP或者PHP页面,这个时候系 ...
- 攻城狮在路上(肆)How tomcat works(三) 连接器:Connector
在介绍中提到,Catalina中有两个主要的模块:连接器和容器.本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序.一个符合Servlet 2.3和2.4规范的连接器必须 ...
- Go 中的反射要点
简介 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力.不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型. 类型以及接口 这个基本概念需要清晰,这里不详细展开. ...
- Storyboards
这里是吐槽时间,换掉了mac默认的输入法,出发点只有一个,就是切换中英文输入的时候相当不爽.也许是习惯了其他各大输入法的一键切换,而又没有找到自带输入法可设置的地方. Segue 以前我们使用navi ...
- hdu 4039 2011成都赛区网络赛I ***
两层搜索,直接for循环就行了,还要注意不能是自己的朋友 #include<cstdio> #include<iostream> #include<algorithm&g ...
- Tips for OpenMesh
OpenMesh 求两点之间的距离 MyMesh::Point p1(1,2,3); MyMesh::Point p2(1,2,5); double d=(p1-p2).length();
- App界面交互设计规范(转)
在上篇<APP界面设计风格>确定下来后,产品经理(兼交互设计)还不用着急将所有的交互稿扔给设计师进行细致的界面设计.在细节设计启动前,拉上设计师和安卓前端开发.ios前端开发一起商议确定设 ...
- 写给自己的web开发资源
web开发给我的感觉就是乱七八糟,而且要学习感觉总是会有东西要学习,很乱很杂我也没空搞,(其实学习这个的方法就是去用它,什么你直接用?学过js么学过jquery么?哈哈,我没有系统的看完过,但是也做出 ...