目录
一、decode函数
二、nvl函数的用法
三、oracle的查询必须是select ... from ...成对出现
oracle查询结果多行用逗号拼接
四、oracle递归获取所有子或者父节点
五、oracle使用正则表达式
特殊字符
字符簇
转义符
六、Oracle添加新链接
七、substr的用法
八、遍历所有数据
九、Oracle的五种循环
Exit When循环
Loop循环
While循环
For普通循环
For游标循环
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 未能与任何一序偶匹配成功时,函数返回的默认值下面的例子说明了,如何读取用户CHECKUP表SEAPARK中的BLOOD_TEST_FLAG列下的项目,作为DECODE函数的实参支持值。
如果你某个字段为空,但是你想让这个字段显示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
查询单行的时候可以用dual代替,dual表在系统中只有一行;
例如:获取系统时间;
select sysdate from dual
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
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
替换掉大写字母:
SELECT REGEXP_REPLACE(printNo,'^[A-Z]*','') AS ISSUENO FROM TB_BASE_PRINTORDERLIST
Oracle 10g支持正则表达式的四个新函数分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和 REGEXP_REPLACE。
- '^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
- '$' 匹配输入字符串的结尾位置。如果设置了RegExp 对象的Multiline 属性,则$ 也匹配'n' 或'r'。
- '.' 匹配除换行符n之外的任何单字符。
- '?' 匹配前面的子表达式零次或一次。
- '*' 匹配前面的子表达式零次或多次。
- '+' 匹配前面的子表达式一次或多次。
- '( )' 标记一个子表达式的开始和结束位置。
- '[]' 标记一个中括号表达式。
- '{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
- '|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。
- 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 位置和顺序
| “或”操作
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——服务命名;
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;
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;
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;
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;
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;
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;