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. 创建DLL、Lib以及使用DLL、Lib

    1.要在生成DLL文件的同时生成Lib文件,函数声明时前面要加__declspec(dllexport). 可在头文件中如下定义: #ifndef __MYDLL_H#define __MYDLL_H ...

  2. UINavigationController导航条是否挡住下面的内容

    控制 UINavigationController 导航条是否挡住下面的内容 if ([[[UIDevice currentDevice] systemVersion] floatValue] > ...

  3. 关于logcat日志

    最近学习android,碰到了logcat,个人总结一下. 当不出日志是解决办法: ProjectMenu---后台设置----LOG设置---LOG开关 Logcat(deprecated)和Log ...

  4. logstash之multiline插件,匹配多行日志

    在外理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如log4j.运行时日志跟访问日志最大的不同是,运行时日志是多行,也就是说,连续的多行才能表达一个意思. 在filter中,加 ...

  5. CLR via C#(11)-无参属性、有参数属性(索引器)

    一. 无参属性 1. 定义属性 无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断.属性的定义其实不复杂,先看个直观的例子: 说明: 属性要定义名称和类型,且类型不能是void. 属性是 ...

  6. CSS3实现32种基本图形

    CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出.直接用CSS3画出这些图形,要比贴图性能更好,体验更加,是一种非常好的网页美观方式. 这32种图形分别为圆形,椭圆形,三角形,倒三角形, ...

  7. 多线线程async与await关键字

    创建线程 //这里面需要注意的是,创建Thread的实例之后,需要手动调用它的Start方法将其启动. //但是对于Task来说,StartNew和Run的同时,既会创建新的线程,并且会立即启动它. ...

  8. SQLAlchemy增删改查基本操作,及SQL基本技能样码(join,group)

    练了一天,基本的东东应该有感觉了. #coding=utf-8 from datetime import datetime from sqlalchemy import (MetaData, Tabl ...

  9. SQL Server 2014 BI新特性(三)Power Query和Power Map功能预览

    Power Query和Power Map是微软前不久在WPC上发布的Power BI中新的针对Excel的功能.借助这两样功能,自助式BI将更方便你发现和处理数据并且丰富数据的可视化功能. Powe ...

  10. PMP 第三章 单个项目的项目管理标准

    1 项目管理五大过程组分别是什么? 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组 2 启动项目组是干什么?包含哪些过程?每个阶段都需要启动吗? 启动过程组:获得授权,定义一个新项目或现有 ...