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. linux more AND less

    ================================more================================ more 是我们最常用的工具之一,最常用的就是显示输出的内容, ...

  2. Mysql之高可用

    使用缓存Memcache, 1,可使用Hash算法由客户端决定路由到哪个Memcache服务器上:客户端完全不用关心数据存储在哪个Memcache服务器上:完全隔离了客户端与服务端:由于是Hash,在 ...

  3. Mysql游标

    14.6.6.1 Cursor CLOSE Syntax 14.6.6.2 Cursor DECLARE Syntax 14.6.6.3 Cursor FETCH Syntax 14.6.6.4 Cu ...

  4. 经典.net试题

    经典.net面试题目 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private :   私有成员, 在类的内部才可以访问. pr ...

  5. iOS 短信分享 邮件分享

    本地调用短信分享. #import "shareViewController.h" @interface shareViewController (){ UIAlertView * ...

  6. Android利用Gson解析嵌套多层的Json

    参考:http://www.cnblogs.com/jxgxy/p/3677256.html 比如我们要解析一个下面这种的Json: String json = {"a":&quo ...

  7. UVA 10192 Vacation

    裸最长公共子序列 #include<time.h> #include <cstdio> #include <iostream> #include<algori ...

  8. ASP.NET MVC Json()处理大数据异常解决方法,字符串的长度超过了为 maxJsonLength

    问题: 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. <system.web.exten ...

  9. 对Object类中方法的深入理解

    看一下API中关于Object的介绍: 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法. 那么Object中到底有哪些方法,各自有什 ...

  10. 【PHP&&FileIO】

    在程序员的眼中,文件不应当仅仅是一部电影.一首歌曲.一个pdf文件,它应该被视为一个文件夹,而我们所熟知的文件,应当是它的特例. 在web开发中,文件的上传和下载是文件变成的一个实际应用. 延续cru ...