1. 程式人生 > 其它 >oracle 基礎語句教程

oracle 基礎語句教程

1、使用者及表空間

--建立使用者

create user jiading identified by jiading

default tablespace TS_BE3U

--授權

grant dba to jiading

--刪除使用者

drop user jkm cascade

--表空間擴容

alter database datafile 'D:\drgs\DRGSQY' resize 20480m;

2:建立資料表空間

create tablespace user_data

logging

datafile 'Q:\oracle\product\10.2.0\oradata\Test\xyrj_data.dbf'

size 50m

autoextend on

next 50m maxsize 20480m

extent management local;

--查看錶空間使用

SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size

FROM dba_tablespaces t, dba_data_files d

WHERE t.tablespace_name = d.tablespace_name

GROUP BY t.tablespace_name;

--查看錶空間使用

SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name

FROM dba_free_space

GROUP BY tablespace_name;

SELECT a.tablespace_name,

a.bytes total,

b.bytes used,

c.bytes free,

(b.bytes * 100) / a.bytes "% USED ",

(c.bytes * 100) / a.bytes "% FREE "

FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c

WHERE a.tablespace_name = b.tablespace_name

AND a.tablespace_name = c.tablespace_name;

----檢視使用者佔用的表空間大小

select owner, tablespace_name, sum(bytes) / 1024 / 1024

from dba_segments where tablespace_name='DRGSQY'

group by owner, tablespace_name;

擴大表空間

alter database datafile 'D:\ORACLE\ORADATA\LYGL\SDE.DBF' resize 20480m;

增加新的資料檔案

alter tablespace SDE add datafile 'D:\ORACLE\ORADATA\LYGL\SDE01.DBF' size 20480m;

設定表空間的自動增長

alter database datafile '? D:\ORACLE\ORADATA\LYGL\SDE01.DBF ? '?? autoextend on next 100m maxsize 20480m;

----查看錶所在的表空間

SELECT

TABLE_NAME,

TABLESPACE_NAME

FROM

USER_TABLES;

-----修改表所在的表空間

alter table anhui.DEPARTMENT_20171013 move tablespace drgsqy

---- 檢視一個表所佔用的空間

SELECT TABLESPACE_NAME,

TO_CHAR(SUM(BYTES) / (1024 * 1024), '999G999D999') CNT_MB

FROM DBA_EXTENTS

WHERE OWNER = 'GUILIN'

AND SEGMENT_NAME = 'T_DRG_ZY_MEDICALRECORD'

AND SEGMENT_TYPE LIKE 'TABLE%'

GROUP BY TABLESPACE_NAME;

2、鎖表

檢視鎖表程序SQL語句1:

select sess.sid,

sess.serial#,

lo.oracle_username,

lo.os_user_name,

ao.object_name,

lo.locked_mode

from v$locked_object lo,

dba_objects ao,

v$session sess

where ao.object_id = lo.object_id and lo.session_id = sess.sid;

檢視鎖表程序SQL語句2:

select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;

殺掉鎖表程序:

如有記錄則表示有lock,記錄下SID和serial# ,將記錄的ID替換下面的738,1429,即可解除LOCK

alter system kill session '738,1429';

3、查詢正在執行的sql語句

SELECT b.sid oracleID,

b.username 登入Oracle使用者名稱,

b.serial#,

spid 作業系統ID,

paddr,

sql_text 正在執行的SQL,

b.machine 計算機名

FROM v$process a, v$session b, v$sqlarea c

WHERE a.addr = b.paddr

AND b.sql_hash_value = c.hash_value

4、查詢重複資料

select * from t_drg_zy_medicalrecord a

where (a.usercode,a.bah,a.zycs) in

(select usercode,bah,zycs from t_drg_zy_medicalrecord

group by usercode,bah,zycs having

count(*) > 1 )

order by bah

--刪除重複資料

delete from t_drg_zy_medicalrecord a

where (a.usercode,a.bah,a.zycs) in

(select usercode,bah,zycs from t_drg_zy_medicalrecord group by usercode,bah,zycs having

count(*) > 1)

and rowid not in

(select min(rowid) from t_drg_zy_medicalrecord group by usercode,bah,zycs having count(*)>1)

5、根據身份證號更新性別

--假設表test,欄位sex是性別,cert_number是身份證號碼,都是varchar2型別

--15位 最後一位奇數或偶數代表一個人的性別

update test t set t.sex = decode(mod(to_number(t.cert_number),2),0,'男','女')

where upper(t.cert_number) not like '%X' and length(t.cert_number) = 15;

--最後一位是X,且長度為15的,無法判斷性別

update test t set t.sex = '最後一位是X,無法判斷性別!'

where upper(t.cert_number) like '%X' and length(t.cert_number) = 15;

--18位 倒數第=位的奇數或偶數代表男性或女性

update test t set t.sex = decode(mod(to_number(substr(t.cert_number,17,1)),2),0,'男','女')

where length(t.cert_number) = 18;

6、匯出dmp時空表無法匯出

方法1、

select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0

方法2、

select 'alter table ' || table_name || ' allocate extent(size 64K);'

from tabs t

where not exists (select segment_name

from user_segments s

where s.segment_name = t.TABLE_NAME);

將結果語句匯出,再執行匯出語句

7、查詢使用者下的所有表及表說明

select t.table_name, f.comments

from user_tables t

inner join user_tab_comments f

on t.table_name = f.table_name;

8、鎖使用者

system登入

使用者被鎖可能原因:嘗試多次失敗登陸造成的被鎖注:一般資料庫預設是10次嘗試失敗後鎖住使用者

執行這個語句看看是那個ip多次訪問導致的鎖庫:

select sessionid,userid,userhost,comment$text,spare1,ntimestamp# from sys.aud$ where returncode=1017

檢視使用者是否被鎖:

select LOCK_DATE,username from dba_users where username='RCZYY'

解鎖:

ALTER USER RCZYY ACCOUNT UNLOCK

9、查詢各個表的資料量

select t.table_name,t.num_rows from all_tables t

檢視記錄數,num_rows不是實時的,儲存的是上次分析後的值,不準確,要使用該方法,必須分析後才可以使用。

--1、建立oracle 函式---統計各個表的資料

create or replace function count_rows(table_name in varchar2,

owner in varchar2 default null)

return number

authid current_user

IS

num_rows number;

stmt varchar2(2000);

begin

if owner is null then

stmt := 'select count(*) from "'||table_name||'"';

else

stmt := 'select count(*) from "'||owner||'"."'||table_name||'"';

end if;

execute immediate stmt into num_rows;

return num_rows;

end;

--2 、統計各個表的資料

select t.table_name, count_rows(t.table_name) nrows from all_tables t

where t.OWNER='CDR'

order by nrows desc;