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. -[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000000000e3

    网络数据解析出现-[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000000000e3这样的错误,具体 re ...

  2. [Java 基础] 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    reference : http://www.cnblogs.com/linjiqin/archive/2013/05/30/3108188.html 在Java多线程应用中,队列的使用率很高,多数生 ...

  3. 做一个App前需要考虑的几件事

    本文转载于文章原文链接,版本归原作者所有! 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后, ...

  4. NYOJ题目114某种序列

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAscAAAHuCAIAAAD83zYaAAAgAElEQVR4nO3dP1LjygIv4LcJ5yyE2A

  5. 苹果开发者账号申请时报错提示错误:Legal Entity Name

    he information you entered did not match your profile in the D&B database. Before submitting you ...

  6. 设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

    一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. ...

  7. ss + pac

    浅析PAC,教你动手修改你的PAC文件及user-rule文件实现自动代理 - 推酷http://www.tuicool.com/articles/V77jyu shadowsocks自定义代理规则u ...

  8. java中常用的工具类(三)

    继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类       ...

  9. 11g Physical Standby配置

    一,准备   Database DB_UNIQUE_NAME Oracle Net Service Name Primary PROD PROD Physical standby PRODDG PRO ...

  10. Tabular Model下的ADOMD.NET

    ADOMD.NET是一套对象架构体系,它包含需要向SSAS数据库做访问的一切支持的对象和方法.很多微软官方以及第三方的SSAS客户端应用都是通过这个对象来操作数据. 多维模式的ADOMD.NET在我以 ...