ORACLE 一些语法及函数
语法
- 创建序列,常用于插入数据时ID自增
-----SEQ_TRANSPORT_PRODUCT 序列名;
-----从1000开始自增 每次自增1
CREATE SEQUENCE SEQ_TRANSPORT_PRODUCT
minvalue 1
maxvalue 999999999
start WITH 1000
INCREMENT by 1
nocache
nocycle;
- 插入数据时,使用序列进行 ID自增
----- SEQ_ENUMERATE.nextval 序列名.nextval
INSERT INTO ENUMERATE ( "ID", "ENUM_TYPE", "ENUM_VALUE", "ENUM_ORDER", "DESCRIPTION" )
VALUES
( SEQ_ENUMERATE.nextval, 'TransportProductArea', 'D', NULL, NULL );
- 查看数据库连接数
----当前的数据库连接数
SELECT count(*) FROM v$process;
----数据库允许的最大连接数
SELECT value FROM v$parameter where name = 'processes';
----修改最大连接数 300
alter system set processes = 300 scope = spfile;
- 从一张表根据条件批量更新数据到另一张表
----先根据条件查出 目的表的id 以及需要的对应字段值
----通过id关联 批量更新
merge into FEE_BILL fee
using (
SELECT fb.ID,substr(wm_concat(DISTINCT ac.BILL_CODE),0,159) billCode
from FEE_BILL fb
LEFT JOIN ACCOUNT_BOOK ac on fb.id=ac.FEE_BILL_ID
LEFT JOIN ORGANIZATION_UNIT org on fb.BALANCE_ORG_UNIT_ID= org.id
where org.name='JUSDA INDIA SO'
GROUP BY fb.ID) ac
on (fee.id=ac.id)
when matched then
update set fee.BILL_CODES = ac.billCode;
5.创建函数—自定义函数 调用函数的方式使查询SQL执行更快
- getConsignersByShipmentId 函数名
- v_id 定义为函数入参
- CONSIGNORS 定义为函数返回参数
- cnts 定义为临时变量 主要用于判断查询结果条数是否大于5 大于 则用‘@@…’ 进行拼接
- 本函数主要功能:根据ID 查询并返回 以‘@@’拼接的名称字符串
- 函数结果举例:
查询结果小于5条:公司名称1@@公司名称2@@公司名称3
查询结果大于5条:公司名称1@@公司名称2@@公司名称3@@公司名称4@@公司名称5@@…
create or replace FUNCTION getConsignersByShipmentId(v_id in number) RETURN VARCHAR2 as CONSIGNORS VARCHAR2(255);
cnts number :=0;
BEGIN
SELECT
listagg( pro.FULL_NAME,'@@') WITHIN group(order by tab.id) into CONSIGNORS
FROM
TMS_WAY_BILL tab
LEFT JOIN BUSINESS_ORGANIZATION pro on pro.id=tab.CONSIGNOR_ID
WHERE
tab.id IN ( SELECT MAX( ab.id ) FROM TMS_WAY_BILL ab WHERE ab.SHIPMENT_ID = v_id GROUP BY ab.CONSIGNOR_ID )
AND ROWNUM < 6 ;
SELECT count(MAX( ab.id )) into cnts FROM TMS_WAY_BILL ab WHERE ab.SHIPMENT_ID =v_id GROUP BY ab.CONSIGNOR_ID;
if (cnts>5) then CONSIGNORS := CONSIGNORS || '@@...' ;end if;
return (CONSIGNORS);
end getConsignersByShipmentId;
----函数使用 : from 后可查询任意表
select getConsignersByShipmentId(12456) from dual;
- 创建或更新视图
-----ZG_TRANSPORT_FILE_VIEW 视图名
create or replace view ZG_TRANSPORT_FILE_VIEW as
相关查询语句 ;
- 查看数据库中被锁的表,并杀死对应进程,释放表
- 当测试某些需要很久时间的业务时,及时释放对应进程,加速定位bug、优化代码
----查看数据库中被锁的表
SELECT b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b WHERE b.object_id=a.object_id;
----查看被锁的进程
SELECT b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b where a.session_id=b.sid order by b.logon_time;
----杀死进程 例如 kill session '2841,27159'
alter system kill session 'sid,serial#';
函数
- 用于模糊查询 ESCAPE 转义符
- 在模式中,当转义符(ESCAPE)置于通配符之前时,该通配符就解释为普通字符
----第一个和最后一个%作为通配符,中间的%作为普通字符。
select * from a WHERE name LIKE '%aa/%bb%' ESCAPE '/';
- max与group by 结合使用
- 注意:使用MAX 函数和 GROUP 的时候会有不可预料的数据被SELECT 出来。只能查询max(id),查询其余字段时id会发生错乱(id会是group by分组后的第一条记录的基本信息)
----用于返回 9条以逗号分隔的编码字符串
SELECT ZH_CONCAT(tab.billCode)
FROM AccountBook tab
WHERE tab.id in (
SELECT MAX(ab.id) FROM AccountBook ab
WHERE ab.feeBill.id = :feeBillId GROUP BY ab.billCode
) AND ROWNUM < 10
- DECODE 函数
- 如果条件/列= 列值1,那么返回返回值1;如果条件/列 = 列值2,那么返回返回值2;……以此类推,如果所有条件都不满足,那么返回默认值。
decode(t.sex, '1', '男生', '2', '女生', '其他');
----decode中使用decode
decode(sign(sal - 5000),1,'高薪',0,'高薪',-1,decode(sign(sal - 3000), 1, '中等', 0, '中等', -1, '低薪'));
- NVL2 函数
- 若指定列中的值不为空,则返回返回值1,否则返回返回值2。
nvl2(出生地,'已知','未知')
- sign 函数
- 会根据value的值为0,正数,负数,分别返回0,1,-1
sign(t.age - 20)
- instr 函数
----返回0 未找到
----返回结果!=0 找到且返回结果为字符串位置
instr( 'abhch', 'a' ) --返回1
- to_date 日期格式转换函数
to_date('2010-11-16 10:48:59','YYYY-MM-DD HH:MI:SS')
- PIVOT 行转列
SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]
FROM WEEK_INCOME
PIVOT
(
SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])
)TBL ------别名,重要!!!
- UNPIVOT 列转行
- …持续更新