1.oracle字符串分割函数split

)定义split_type类型:

  1. CREATE OR REPLACE TYPE split_type IS TABLE OF VARCHAR2 (4000)

)定义split函数:

  1. CREATE OR REPLACE FUNCTION split (
  2.     p_str IN VARCHAR2,
  3.     p_delimiter IN VARCHAR2 default(',') --分隔符,默认逗号
  4. )
  5.     RETURN split_type
  6.     j INT := 0;
  7.     i INT := 1;
  8.     len INT := 0;
  9.     len1 INT := 0;
  10.     str VARCHAR2 (4000);
  11.     my_split split_type := split_type ();
  12.     len := LENGTH (p_str);
  13.     len1 := LENGTH (p_delimiter);
  14.  
  15.     WHILE j < len
  16.     LOOP
  17.         j := INSTR (p_str, p_delimiter, i);
  18.  
  19.         IF j = 0
  20.         THEN
  21.             j := len;
  22.              str := SUBSTR (p_str, i);
  23.              my_split.EXTEND;
  24.              my_split (my_split.COUNT) := str;
  25.  
  26.             IF i >= len
  27.             THEN
  28.                 EXIT;
  29.             END IF;
  30.         ELSE
  31.             str := SUBSTR (p_str, i, j - i);
  32.             i := j + len1;
  33.             my_split.EXTEND;
  34.             my_split (my_split.COUNT) := str;
  35.         END IF;
  36.     END LOOP;
  37.  
  38.     RETURN my_split;
  39. END split;

)测试split函数:

  1. select * from table (split('1,2,3,4',','))

出处: http://www.chinasb.org/archives/2011/02/1442.shtml#viewSource

2.循环控制结构语句

2.1.基本循环

  1. LOOP
  2.          statement1;
  3.          ......
  4.           EXIT [WHEN condition];
  5. END LOOP;

EG:

  1. I INT:= 1
  2.    LOOP
  3.       INSERT INTO COMPANY VALUES('PZDNDD' || I );
  4.       EXISTS WHEN I = 10;
  5.       I := I + 1;
  6.    END LOOP;
  7. END;

2.2 while循环

  1. WHILE condition LOOP
  2.            statement1;
  3.            statement2;
  4.            .....
  5. END LOOP;

EG:

  1. I INT:= 1
  2.    WHILE I <= 10 LOOP
  3.       INSERT INTO COMPANY VALUES ('PZDNDD' || I);
  4.       I := I + 1;
  5.    END LOOP;
  6. END;

2.3 for循环

  1. FOR counter in [REVERSE] lower_bound. .upper_bound LOOP
  2.          statement1;
  3.          statement2;
  4.          .......
  5. END LOOP;

counter是循环控制变量,并且该变量由oracle隐含定义,不需要显式定义。lower_bound和upper_bound分别对应于循环控制变量的下界值和上界值,默认情况下,当使用FOR循环时,每次循环时循环控制变量会自动增1.如果指定REVERSE选项,那么每次循环时循环控制变量会自动减1.

EG:

  1.    FOR I IN REVERSE 1..10 LOOP
  2.       INSERT INTO COMPANY VALUES ('PZDNDD' || I);
  3.    END LOOP;
  4. END;

3.分支控制结构

  1. –情形1
  2. IF CONDITION THEN
  3.    ......
  4. –情形2
  5. IF CONDITION THEN
  6.    ......
  7.    ......
  8. –情形3
  9. IF CONDITION THEN
  10.    ......
  11. ELSIF CONDITION2 THEN
  12.    ......
  13. ELSIF CONDITION3 THEN
  14.    ......

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)

  1. SELECT SYSDATE FROM DUAL;
  2. SELECT SYSDATE + 1 * 7 FROM DUAL;
  3. SELECT SYSDATE + 1 FROM DUAL;
  4. SELECT SYSDATE + 1/24 FROM DUAL;
  5. SELECT SYSDATE + 1/24/60 FROM DUAL;
  6. add_months(sysdate,12)

以上分别加一周、一天、一小时、一分钟。加一个月。

另外指定计算:

  1. select sysdate,sysdate + interval '' SECOND from dual
  2. select sysdate,sysdate + interval '' MINUTE from dual
  3. select sysdate,sysdate + interval '' HOUR from dual
  4. select sysdate,sysdate + interval '' day from dual
  5. select sysdate,sysdate + interval '' month from dual
  6. select sysdate,sysdate + interval '' year from dual

以上分别加两(秒,分,时,天,月,年)。

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相差计算

计算基准:默认时间相减获得相差的天数。

  1. select To_date('2015-07-17 13:31:00' , 'yyyy-mm-dd hh24-mi-ss') -
  2. 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.插入一条数据,并返回主键

  1. INSERT INTO a VALUES (xxx, xxx)
  2. 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规则

  1. 对于after 类型的 for each row 级别的triggers,不论哪种insert语句触发了trigger,都不允许在 trigger 中访问本trigger所依赖的table的;
  2. 对于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:

  1. TYPE TABLETYPE1 IS TABLE OF TASK_USER%ROWTYPE INDEX BY BINARY_INTEGER;
  2. TABLE1 TABLETYPE1;

其中,TASK_USER为数据库中一个表。

类型可以是number 、varchar2、date 等数据类型,index by binary_integer 子句代表以符号整数为索引,这样访问表类型变量中的数据方法就是"表变量名(索引符号整数)"。

示例1:定义值为单一数据类型的Index-By表。

  1. --value 为varchar2(10) 类型
  2. TYPE tabletype1 IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
  3. table1 tabletype1;
  4.  
  5. --value 为TASK表中CODE字段的类型
  6. TYPE tabletype2 IS TABLE OF TASK.CODE%TYPE INDEX BY BINARY_INTEGER;
  7. table2 tabletype2;
  8.  
  9.    table1(1) := '大学'; --通过键 1 访问
  10.    table1(2) := '大专';
  11.  
  12.    table2(1) := '';
  13.    table2(2) := ''; --通过键 2 访问
  14.    dbms_output.put_line(table1(1)||table2(1));
  15.    dbms_output.put_line(table1(2)||table2(2));
  16. END;

注:下面的程序定义了名为tabletype1和tabletype2的两个Index-By表。table1和table2分别是两种表类型变量。

示意图:

示例2:定义一个值为TASK表类型的Index-By表。

  1.  
  2. TYPE TABLETYPE1 IS TABLE OF TASK_USER%ROWTYPE INDEX BY BINARY_INTEGER;
  3. T1 TABLETYPE1;
  4.  
  5.    SELECT * INTO T1(1) FROM TASK_USER TU WHERE TU.TASK_CODE = '';
  6.    dbms_output.put_line(T1(1).USER_TYPE);
  7. 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)的更多相关文章

  1. Oracle分组小计、总计示例(grouping sets的使用)

    1.首先创建一个表 create table TE ( ID        VARCHAR2(2), T_CODE    VARCHAR2(4), T_NAME    VARCHAR2(4), T_A ...

  2. Oracle 使用小计(3)

      1.出错处理 ORA-00911: invalid character. 这是因为在语句末尾加上了";"的缘故,去掉";"SQL就可以执行了~ (这与SQL ...

  3. Oracle 使用小计(2)

    1.时间转换 1.1 字符串转时间 今天需要写SQL语句更新数据库的时间,按照SQL Server的习惯写成 UPDATE TABLE A ’ WHERE ORDER_ID = ‘A12345678’ ...

  4. Oracle 使用小计

    1.Sequence 1.1 什么是Sequence? Sequence是oracle提供的一个对象,用于产生自增的主键.这与sql server的identity是类似的. 从数学的角度来说,其为一 ...

  5. 使用EF操作Oracle数据库小计

    1.建表 CREATE TABLE item.ORDERS( ORDERID ) CONSTRAINT PK_ORDERS PRIMARY KEY, ORDERNO ), STOREID ), STO ...

  6. oracle操作小计

    1.查询oracle的连接数 select count(*) from v$session; 2.查询oracle的并发连接数 select count(*) from v$session where ...

  7. oracle 报表带小计合计

    selectcase when (grouping(glbm)=1) then '合计' else DECODE(glbm,null,'',glbm) end glbm,case when (grou ...

  8. oracle group by rollup实现小计、合计

    SQL合计汇总实现数据N+1条显示: 注意group by rollup((ename, job, empno))!!! select decode(grouping(ename) + groupin ...

  9. oracle学习小知识点总结

    登陆数据库:sqlplus "/as sysdba" window身份验证,不需要用户名和密码. 查看数据库状态: select status from v$instance(v$ ...

随机推荐

  1. ios滑动手势全屏(这段代码实现了下一级控制器滑到上一级控制器)

    在自定义导航控制器里面加以下代码就增加全屏滑动手势 >推向前一个控制器 //  HBNavigationController.m // #import "HBNavigationCon ...

  2. 利用android来赚钱

    看了一篇fenger 大神写的文章,受益匪浅,在此做一下记录 转载地址:http://bbs.csdn.net/topics/370249613 其他参考地址: http://bbs.gfan.com ...

  3. XMPP框架下微信项目总结(5)花名册获取(好友列表)

    ---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...

  4. CLR via C#(16)--泛型

    泛型就像是一个模板,常常定义一些通用的算法,具体调用时再替换成实际的数据类型,提高了代码的可重用性. 一.初识泛型 1. 简单实例 以最常用的FCL中的泛型List<T >为例: stat ...

  5. 深入理解JavaScript定时机制和定时器注意问题

    容易欺骗别人感情的JavaScript定时器 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不 ...

  6. HDU5792 World is Exploding(树状数组)

    一共6种情况,a < b且Aa < Ab, c < d 且Ac > Ad,这两种情况数量相乘,再减去a = c, a = d, b = c, b = d这四种情况,使用树状数组 ...

  7. MS SQL数据批量备份还原(适用于MS SQL 2005+) 分类: SQL Server 数据库 2015-03-10 14:32 103人阅读 评论(0) 收藏

    我们知道通过Sql代理,可以实现数据库的定时备份功能:当数据库里的数据库很多时,备份一个数据库需要建立对应的定时作业,相对来说比较麻烦: 还好,微软自带的osql工具,比较实用,通过在命令行里里输入命 ...

  8. Unity3D项目开发一点经验

    我们主要使用3dsmax2010进行制作,输出FBX的类型导入Unity3D中.默认情况下,3dsmax8可以和U3D软件直接融合,自动转换为FBX物体. 注意事项如下: 1.面数控制 在MAX软件中 ...

  9. xcrun: error: active developer path ("/XX") does not exist

    MAC OS 10.9下执行命令 svn --version 报出如下错误: xcrun: error: active developer path ("/Users/username/Do ...

  10. 外观模式/facade模式/结构型模式

    外观模式 为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式三要素(client-facade-subSystem) 外观角色 ...