> 文章列表 > Oracle学习笔记

Oracle学习笔记

Oracle学习笔记

目录

一、decode函数

二、nvl函数的用法

三、oracle的查询必须是select ... from ...成对出现

oracle查询结果多行用逗号拼接

四、oracle递归获取所有子或者父节点

五、oracle使用正则表达式

特殊字符

字符簇

转义符

六、Oracle添加新链接

七、substr的用法

八、遍历所有数据

九、Oracle的五种循环

Exit When循环

Loop循环

While循环

For普通循环

For游标循环


一、decode函数

select checkup_type, decode(blood_test_flag,’Y’,’Yes’,’N’,’No’,NULL,’None’,’Invalid’)

from checkup;

decode函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。区别于SQL的其它函数,decode函数还能识别和操作空值.

其具体的语法格式如下:decode(input_value,value,result[,value,result…][,default_result]);

其中:input_value 试图处理的数值decode函数将该数值与一系列的序偶相比较,以决定最后的返回结果value 是一组成序偶的数值。如果输入数值与之匹配成功,则相应的结果将被返回。对应一个空的返回值,可以使用关键字NULL于之对应result 是一组成序偶的结果值default_result 未能与任何一序偶匹配成功时,函数返回的默认值下面的例子说明了,如何读取用户CHECKUPSEAPARK中的BLOOD_TEST_FLAG列下的项目,作为DECODE函数的实参支持值。

 二、nvl函数的用法

如果你某个字段为空,但是你想让这个字段显示0nvl(字段名,0),就是当你选出来的时候,这个字段虽然为空,但是显示的是0,当然这个0也可以换成其他东西,如:1,2,3……

NULL指的是空值,或者非法值。

NVL (expr1, expr2)->expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致

NVL2 (expr1, expr2, expr3) ->expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换为expr2的类型

NULLIF (expr1, expr2) ->相等返回NULL,不等返回expr1

三、oracle的查询必须是select ... from ...成对出现

查询单行的时候可以用dual代替,dual表在系统中只有一行;

例如:获取系统时间;

select sysdate from dual

oracle查询结果多行用逗号拼接

SELECT WM_CONCAT(GOODSTYPENAME) FROM TB_SYS_PRODUCT_FORBIDGOODSTYPE fib LEFT JOIN TB_SYS_GOODSTYPE ty ON fib.goodstypeid=ty.goodstypeid WHERE fib.productid=t.productid

四、oracle递归获取所有子或者父节点

pid为子级的父级id的字段名称

从Root往树末梢递归:获取子级

select * from temp

start with id=3 /*父级的id*/

connect by prior id = pid /*pid 子级的父级id的字段名称*/

从末梢往树ROOT递归:获取父级

select * from temp

start with id=3

connect by id = prior pid /*pid子级的父级id的字段名称*/

如果需要显示层次结构

select sys_connect_by_path(id,'/'),pid from temp

start with id=1

connect by prior id = pid

Rg:

SELECT * from tb_base_netpoint t

START WITH t.netpointid=74852

CONNECT BY PRIOR t.netpointid=t.parentnetpoint

五、oracle使用正则表达式

替换掉大写字母:

SELECT REGEXP_REPLACE(printNo,'^[A-Z]*','') AS ISSUENO FROM TB_BASE_PRINTORDERLIST

Oracle 10g支持正则表达式的四个新函数分别是:REGEXP_LIKEREGEXP_INSTRREGEXP_SUBSTR、和 REGEXP_REPLACE

特殊字符:

  1. '^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
  2. '$' 匹配输入字符串的结尾位置。如果设置了RegExp 对象的Multiline 属性,则$ 也匹配'n' 或'r'。
  3. '.' 匹配除换行符n之外的任何单字符。
  4. '?' 匹配前面的子表达式零次或一次。
  5. '*' 匹配前面的子表达式零次或多次。
  6. '+' 匹配前面的子表达式一次或多次。
  7. '( )' 标记一个子表达式的开始和结束位置。
  8. '[]' 标记一个中括号表达式。
  9. '{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
  10. '|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。
  11. num 匹配num,其中num 是一个正整数。对所获取的匹配的引用。

正则表达式的一个很有用的特点是可以保存子表达式以后使用,被称为Backreferencing. 允许复杂的替换能力

如调整一个模式到新的位置或者指示被代替的字符或者单词的位置. 被匹配的子表达式存储在临时缓冲区中,

缓冲区从左到右编号, 通过数字符号访问。下面的例子列出了把名字aa bb cc 变成

cc, bb, aa.

Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '3, 2, 1') FROM dual;

REGEXP_REPLACE('ELLENHILDISMIT

cc, bb, aa

字符簇

[[:alpha:]] 任何字母。

[[:digit:]] 任何数字。

[[:alnum:]] 任何字母和数字。

[[:space:]] 任何白字符。

[[:upper:]] 任何大写字母。

[[:lower:]] 任何小写字母。

[[:punct:]] 任何标点符号。

[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。

各种操作符的运算优先级

转义符

(), (?:), (?=), [] 圆括号和方括号

*, +, ?, {n}, {n,}, {n,m} 限定符

^, $, anymetacharacter 位置和顺序

| “或”操作

六、Oracle添加新链接

1、<客户端目录>

/network/admin,在admin目录中建立tnsnames.ora文件,

内容大致如下:demo1 = #oracle服务名

(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521)) #oracle服务器地址与端口) (CONNECT_DATA = (SERVICE_NAME = demo1) ) )

2、客户端配置:配置和移植工具——Net Manager——服务命名;

七、substr的用法

TSG.SCHEDULEORDERNO要截取的字符串,从3开始截取,字符串的下标从1开始;

SUBSTR(TSG.SCHEDULEORDERNO, 3)

八、遍历所有数据

for lr in(

SELECT *

from TB_FIN_CREDITORDER

WHERE 1=1

AND to_date(lr.startdate)=to_date(SYSDATE)

AND state=8) loop end loop;

跳出循环:

exit when result=500;

九、Oracle的五种循环

Exit When循环:

create or replace procedure proc_test_exit_when is
i number;
begin
i:=0;
LOOP
Exit When(i>5);
Dbms_Output.put_line(i);
i:=i+1;
END LOOP;
end proc_test_exit_when;

Loop循环:

create or replace procedure proc_test_loop is
i number;
begin
i:=0;
loop
i:=i+1;
dbms_output.put_line(i);
if i>5 then
exit;
end if;
end loop;
end proc_test_loop;

While循环:

create or replace procedure proc_test_while is
i number;
begin
i:=0;
while i<5 loop
i:=i+1;
dbms_output.put_line(i);
end loop;
end proc_test_while;

For普通循环:

create or replace procedure proc_test_for is
i number;
begin
i:=0;
for i in 1..5 loop
dbms_output.put_line(i);
end loop;
end proc_test_for;

For游标循环:

create or replace procedure proc_test_cursor is
userRow test%rowtype;
cursor userRows is
select * from test;
begin
for userRow in userRows loop
dbms_output.put_line(userRow.id||’,'||userRow.Name||’,'||userRows%rowcount);
end loop;
end proc_test_cursor;