您的位置:首页 > 数据库 > Oracle

Oracle DB 学习备注

2016-06-20 14:42 489 查看
1.如何查询出oracle的中文行

select * from user_tab_cols where  length(column_name)<>lengthb(column_name);
2.PLSQL查询结果中文列名显示为“???”或是中文查询条件无结果的状况:

2.1首先执行语句 select * from V$NLS_PARAMETERS 查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否为SIMPLIFIED CHINESE。如果不是,需要设置环境变量。

2.2我的电脑-属性-“高级”-环境变量,在系统变量处点击“新建”,设置变量名:NLS_LANG , 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 。

3.对比日期

select * from aa where date1>to_date('2008-08-08','yyyy-mm-dd')
4.通过比较A,B两个日期型字段,如果A大于B,则返回1;否则,返回0

select
case when A-B>0 then 1 else 0 end
from 表
5.排序

5.1 正序 order by

5.2 倒序 order by desc

6.取最大日期

select max(日期) from 表
7.去重复

select  distinct(job) from emp
select distinct  job, name  from emp
8.合并

union all
9.查找重复次数

select chcod,count(1) from a
group by chcod
having count(1)> 1
10.oracle截取字符前面的值

substr(b.PERIOD_ENTERED,1,instr(b.PERIOD_ENTERED,'-')-1)


11.使用delete语句删除表行数据时候,出现时间在增长,却没有其他反应,表明:表被锁了;

select /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',null) lock_level,
o.owner,
o.object_name,
o.object_type,
s.sid,s.serial#,
s.terminal,
s.machine,
s.program,
s.osuser
from v$session s,v$lock l,dba_objects o
where l.sid = s.sid
and l.id1 = o.object_id(+)
and s.username is not null


select /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username user_name,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#
from v$locked_object l,dba_objects o,v$session s
where l.object_id=o.object_id
and l.session_id=s.sid
order by o.object_id,xidusn desc


oracle 的用户信息都在dba_users表中, 默认只有sys、和sysdba 两个用户是open的。

alter user scott account unlock; 这个命令是给scott用户解锁;
alter user scott identified by tiger; 这个命令是给scott用户设置密码;
通过这两个语句,scott 用户就可以使用了。

另外:设置数据库默认密码为永久有效

ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED ;


17.部分字段替代函数

例:需要将列“xxxx/yy/mm”修改为“xxxx-yy-mm”

update 表1 t set t.列1=replace((select 列1from 表1 a where a.主键列=t.主键列) , '/' , '-' )

replace('将要更改的字符串','被替换掉的字符串','替换字符串')

select  replace ('111222333444','222','888') from dual;                输出为 '111888333444'

在查询的时候将调整期间ADJ替换成12

SELECT case when p like '%ADJ' then replace(p,'ADJ','12') else p end period
,a FROM (
select '2012-12' p,100 a from dual
union all
select '2012-ADJ' p,200 a from dual
) X


18.物化视图

新建语法:

create materialized view materialized_view_name
build [immediate|deferred]  --1.创建方式
refresh [complete|fast|force|never]     --2.物化视图刷新方式
on [commit|demand]   --3.刷新触发方式
start with (start_date)   --4.开始时间
next (interval_date)   --5.间隔时间
with [primary key|rowid]  --默认 primary key

ENABLE QUERY REWRITE   --7.是否启用查询重写
as     --8.关键字
select statement;   --9.基表选取数据的select语句


1.创建方式默认是immediate,立即;deferred,延迟,至第一次refresh时,才生效。

2.物化视图刷新方式默认为force,意思是:如果可以快速刷新,就执行快速刷新;否则,执行完全刷新。

complete,完全刷新,即,刷新时更新全部数据,包括视图中已经生成的原有数据。

fast,快速刷新,只刷新增量部分。前提是,需要在基表上创建物化视图日志(见示例)。该日志记录基表数据变化情况,所以才能实现增量刷新。

never,从不刷新。

3.on commit,基表有commit动作时,刷新视图,不能跨库执行(因为不知道别的库的提交动作);on demand,在需要时刷新,即,根据后面设定的起始时间和时间间隔进行刷新,或者,手动调用dbms_mview包中的过程刷新时再执行刷新。

4和5.即开始刷新时间和下次刷新的时间间隔。如:start with sysdate next sysdate+1/1440 表示马上开始,刷新间隔为1分钟。(与 on commit选项冲突)

6.基于基表的主键或者rowid创建。如果是基于rowid,不能对基表执行分组函数、多表连结等需要把多个rowid合成一行的操作(理由很简单:到底以哪个rowid为准呢?)。

7.如果设置了初始化参数query_rewrite_enabled=true则默认就会启用查询重写。但是,数据库默认该参数为false。并且,不是什么时候都应该启用查询重写。所以,该参数应该设置为false,而在创建特定物化视图时,根据需要开启该功能。另外,如果选择使用了上面第4‘5选项,则不支持查询重写功能(原因很简单,所谓重写,就是将对基表的查询定位到了物化视图上,而4、5选项会造成物化视图上部分数据延迟,所以,不能重写)。

例:

CREATE MATERIALIZED VIEW CUX_FA_MAIN_RESERVE_MV
REFRESH FORCE ON DEMAND
START WITH TO_DATE('07-09-2016 11:58:10', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE+4/24
AS
SELECT * from fa_books_v;


取消语法:

DROP MATERIALIZED VIEW CUX_FA_MAIN_RESERVE_MV;
注意:

DROP 语句将删除表的结构,被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态;(不能回滚)

DELETE 只删除数据不删除表的结构(定义),且删除部分数据与事务有关,如:trigger;(可以回滚)

TRUNCATE 只删除数据不删除表的结构(定义),且删除全部数据与事务无关;(不能回滚)

修改刷新方式:

对于已经创建好的物化视图,可以修改其刷新方式(只能修改刷新方式,不能修改代码):

alter materialized view CUX_FA_MAIN_RESERVE_MV
refresh force on demand
START WITH TO_DATE('09-09-2016 15:58:37', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE+6/24;

手工刷新:

begin
DBMS_MVIEW.REFRESH('表名','刷新方式');
end;
或者
call DBMS_MVIEW.REFRESH('表名','刷新方式');


19.用户权限查看

19.1.查看所有用户:

select * from dba_users;
select * from all_users;
select * from user_users;
19.2.查看用户或角色系统权限(直接赋值给用户或角色的系统权限):

select * from dba_sys_privs;
select * from user_sys_privs;
19.3.查看角色(只能查看登陆用户拥有的角色)所包含的权限

sql>select * from role_sys_privs;
19.4.查看用户对象权限:

select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
19.5.查看所有角色:

select * from dba_roles;
19.6.查看用户或角色所拥有的角色:

select * from dba_role_privs;
select * from user_role_privs;
19.7.查看哪些用户有sysdba或sysoper系统权限(查询时需要相应权限)

select * from V$PWFILE_USERS


19.8.以下语句可以查看Oracle提供的系统权限:

select name from sys.system_privilege_map

19.9.查看一个用户的所有系统权限(包含角色的系统权限)

select privilege from dba_sys_privs where grantee='DATAUSER'
union
select privilege from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='DATAUSER' );



20.NVL函数

对于NVL函数,需要知道什么是oracle中的空值null

20.1 NVL函数

NVL函数的格式:NVL(expr1,expr2)

如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。

select nvl(null,2) from dual;
20.2 NVL2函数

NVL2函数的格式:NVL2(expr1,expr2,expr3)

如果函数的第一个参数不为空,那么显示第二个参数的值,如果第一个参数的值为空,则显示第三个参数的值。

select nvl2(comm,-1,1) from dual;
20.3 NULLIF函数

NULLIF函数的格式:NULLIF(expr1,expr2)

如果expr1和expr2相等,则返回空值null,否则返回第一个值。

20.4 Coalesce函数

该函数与NVL函数相似,其优势就是有更多的选项。

Coalesce函数的格式:Coalesce(expr1,expr2,expr3......,exprn)

函数返回表达式中第一个非空的值。

select coalesce(null,null,3,4,5) from dual;
返回值为:3;

如果所有自变量均为null,则coalesce返回null值。

21.内连接,左连接,右连接

21.1 内连接

内连接,即最常见的等值连接:

select * from TESTA,TESTB
WHERE TESTA.A=TESTB.A
21.2 外连接
外连接分为左外连接,右外连接和全外连接

21.2.1 左外连接left join

左外连接就是在等值连接的基础上加上主表中的未匹配数据:

select * from TESTA
left join TESTB
on TESTA.A=TESTB.A

或者

select * from TESTA,TESTB
where TESTA.A=TESTB.A(+)

21.2.2 右连接right join

右外连接是等值连接的基础上加上被连接表的不匹配数据:

select * from TESTA
right join TESTB
on TESTA.A=TESTB.A
或者
select * from TESTA,TESTB
WHERE TESTA.A(+)=TESTB.A
21.2.3 全外连接 full join
全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上:

select * from TESTA
full join TESTB
on TESTA.A=TESTB.A


22.列转行函数Listagg()

Listagg函数的格式:Listagg(expr1,expr2) within group(order by expr1)

expr1为列转行值,expr2为隔离标点;

with temp as(
select 'China' nation ,'Guangzhou' city from dual union all
select 'China' nation ,'Shanghai' city from dual union all
select 'China' nation ,'Beijing' city from dual union all
select 'USA' nation ,'New York' city from dual union all
select 'USA' nation ,'Bostom' city from dual union all
select 'Japan' nation ,'Tokyo' city from dual
)
select nation,listagg(city,',') within GROUP (order by city)
from temp
group by nation





用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来。

非常方便。

同样是聚合函数,还有一个高级用法:

就是over(partition by expr1)

也就是说,在你不实用Group by语句时候,也可以使用LISTAGG函数:

with temp as(
select 500 population, 'China' nation ,'Guangzhou' city from dual union all
select 1500 population, 'China' nation ,'Shanghai' city from dual union all
select 500 population, 'China' nation ,'Beijing' city from dual union all
select 1000 population, 'USA' nation ,'New York' city from dual union all
select 500 population, 'USA' nation ,'Bostom' city from dual union all
select 500 population, 'Japan' nation ,'Tokyo' city from dual
)
select population,
nation,
city,
listagg(city,',') within GROUP (order by city) over (partition by nation) rank
from temp





总结:LISTAGG()把它当作SUM()函数来使用就可以了。

23.清除oracle数据库缓存:

在使用sql查询语句的时候,出现第一次执行语句,读取速度比较慢,再次执行就很快读取的情况;

很明显是数据库缓存的作用,这样便于用户快速读取数据;

但是在做SQL语句性能测试的时候,就完全不行。

解决方式:

ALTER SYSTEM FLUSH SHARED_POOL ;
ALTER SYSTEM FLUSH BUFFER_CACHE ;
ALTER SYSTEM FLUSH GLOBAL CONTEXT ;

注意:不能在生产环境这么操作;其实我也没有成功,就是记录一下。

(DBMS_SHARED_POOL包提供存储过程来将PL/SQL对象或SQL游标固定到Oracle 共享池。一旦这些对象固定之后,将不再参与aged out,而是常驻内存,即便是使用alter system flush shared_pool也不会将对象清除出共享池。)

24.查看数据库版本信息:

select * from v$version;




25.oracle中特殊符号&的处理:

在oracle中默认动态变量的格式为:&num



但是,如果查询的字符中包含了'&'或是插入的url中包含了‘&’,并不是变量的意思。该如何处理?





NAME列值无法插入;

处理方式,使用定义:

set define off;



成功!!!

注意:

set define off 关闭替代变量功能;
set define on  开启替代变量功能;
set define *   将默认替代变量标志符修改为“*”,当然改成其他字符也是可以的。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 语法