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. swift学习记录之代理

    /// 访客视图的协议 protocol VisitorLoginViewDelegate: NSObjectProtocol { func visitorLoginViewWillRegister( ...

  2. [Android Pro] 网络流量安全测试工具Nogotofail

    reference to : http://www.freebuf.com/tools/50324.html 从严重的HeartBleed漏洞到苹果的gotofail 漏洞,再到最近的SSL v3 P ...

  3. July 5th, Week 28th Tuesday, 2016

    If you smile when no one else is around, you really mean it. 独处的时候你的笑容才是发自内心的笑容. Human beings are so ...

  4. cmd for备忘

    =============参数 /d (参数只能显示当前目录下的目录名字)=================== rem 显示d:\work\目录下与*.txt相匹配的文件(如果报错就%i-> ...

  5. python基础语法(二)

    本文主要包括以下内容 函数 切片 迭代 列表生成式 生成器 迭代器 函数 定义函数 定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块 ...

  6. HTML5 – 4.canvas

    1.绘制矩形 2.绘制圆形 3.绘制文字 4.保存文件 什么是 Canvas? HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. < ...

  7. C#值类型与引用类型

    值类型(Value Type),值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据.其在MSDN的定义为值类型直接包含它们的数据,值类型的 ...

  8. Linux下pipe使用注意事项

    转自:http://blog.yufeng.info/archives/1485 Linux下的pipe使用非常广泛, shell本身就大量用pipe来粘合生产者和消费者的. 我们的服务器程序通常会用 ...

  9. 重温WCF之群聊天程序(十)

    完成的效果图: 服务器端代码: using System; using System.Collections.Generic; using System.Linq; using System.Serv ...

  10. Delphi如何处理不同类型的文件

    参考:http://www.cnblogs.com/railgunman/articles/1800318.html 程序设计当中,我们时常遇到需要处理文件.目录及驱动器的情况,这里将对如何处理不同类 ...