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;