oracle基本操做


DDL(數據定義語言):
create建立
建立表:
create table <table_name(
column datatype [not null] [primary key],
column2 datatype [not null],
……
)
複製表:
create table <table_name> as <select 語句>
建立索引:
create [unique] index <index_name> on <table_name>(字段[asc|desc]);
create index i_1 on emp(empno asc);
建立同義詞:
create synonym <synonym_name> for <tableename/viewname>
create synonym mm for emp;
alter修改
alter table:
添加字段:
alter table <table_name> add (字段 類型 [not null]);
修改字段:
alter table <table_name> modify (字段 類型);
刪除字段:
alter table <table_name> drop 字段;
修改表名:
alter table <table_name> to <new_table_name>;
添加約束:
alter table <table_name> add constraint <constraint_name> 約束類型 (針對的字段名);
alter table emp add constraint pk primary key (empno);
約束禁用:
alter table <table_name> disable constraint <constraint_name>;
約束重啓:
alter table <table_name> enable constraint <constraint_name>;
刪除約束:
alter table <table_name> drop constraint <constraint_name>;
drop刪除:
drop table 刪除表:
drop table <table_name>;
drop table emp;
drop index 刪除索引:
drop index <index_name>;
drop synonym 刪除同義詞:
drop [public/private] synonym <synonym_name>;sql

DML(數據操縱語言)
insert into (插入記錄)
insert into table_name(column1,column2,……) values (column1,column2,……);
insert into table_name (select 語句);
create table a as select * from emp where 1=2;
insert into a select * from emp where sal>2000;
select 查詢記錄
select [distinct] <column1 as[new name],column2……>
from <table_name>
where <條件>
[group by <column_list]
[having <條件>]
[order by <column_list <asc|desc];
DISTINCT --表示隱藏重複的行
WHERE --按照必定的條件查找記錄
GROUP BY --分組查找(須要彙總時使用)
HAVING --分組的條件
ORDER BY --對查詢結果排序
AVG --求平均值
MAX --求最大值
MIN --求最小值
COUNT --求個數
update (更新數據)
update table_name set column1 =new value,column2=new value,…… where <條件>;
update emp set sal=1000,empno=8888 where ename='SCOTT';
delete (刪除數據)
delete table_name where <條件>;
delete from emp where empno='7788';數據庫

DCL(數據控制語言)
受權
grant <權限列表> to <user_name>;
收回權限
revoke <權限列表> from <user_name>;
connect 鏈接
resource 資源
unlimited tablespace 無限表空間
dba 管理員
session 會話服務器

TCL(事務控制語言)
commit;
rollback to savepoint 回滾;
savepoint <savepoint> 保存位置;session

oracle其餘對象
視圖:
create or replace view <view_name> as <select 語句>;
drop view <view_name>oracle

序列:
create sequence <sequence_name>
increment by n
start with n
[maxvalue n][minvalue n]
[cycle|nocycle]
[cache n|nocache]
INCREMENT BY n --表示序列每次增加的幅度;默認值爲1.
START WITH n --表示序列開始時的序列號。默認值爲1.
MAXVALUE n --表示序列能夠生成的最大值(升序).
MINVALUE n --表示序列能夠生成的最小值(降序).
CYCLE --表示序列到達最大值後,在從新開始生成序列.默認值爲 NOCYCLE。
CACHE --容許更快的生成序列.
create sequence se_1
increment by 1
start with 100
maxvalue 999999
cycle;app

alter sequence <sequence_name>
increment by n
start with n
maxvalue n minvalue n
cycle|nocycle
cache n|nocacheide

drop sequence <sequence_name>函數

select <sequence_name>.netxval from dual;
select <sequence_name>.currval from dual;oop

用戶:
create user <user_name> [profile "DEFAULT"]
identified by "<password>" [default tablespace "USERS"]
DROP user <user_name> cascade;fetch

角色:
create role <role_name>
identified by "<password>"

drop role <role_name>;

PL/SQL
基本結構:
declare
聲明語句
begin
執行語句
exception
執行語句
end;
條件控制語句:
IF《條件1》THEN
語句
elsif <條件2> THEN
語句
……
elsif <條件n> THEN
語句
else
語句
end if;

循環控制語句
1. LOOP
語句
exit when<條件>
end loop;
2.while loop
while <條件>
loop
語句
end loop;
3.FOR
for <循環變量> in 下限 .. 上限
LOOP
語句
END LOOP;
NULL語句
null;
表示沒有操做;
註釋使用
單行註釋:--
多行註釋:/*.........
..................*/
異常處理
EXCEPTION
when <異常類型> THEN
語句
WHEN OTHERS THEN
語句;
END;

遊標:
顯示遊標
定義:CURSOR <遊標名> IS <SELECT 語句> [FOR UPDATE | FOR UPDATE OF 字段];
[FOR UPDATE | FOR UPDATE OF 字段] --給遊標加鎖,既是在程序中有"UPDATE","INSERT","DELETE"語句對數據庫操做時。
遊標自動給指定的表或者字段加鎖,防止同時有別的程序對指定的表或字段進行"UPDATE","INSERT","DELETE"操做.
在使用"DELETE","UPDATE"後還能夠在程序中使用CURRENT OF <遊標名> 子句引用當前行.
操做:OPEN<遊標名>
FETCH<遊標名> INTO 變量1,變量2,……變量n;
或者
fetch <遊標名> INTO 行對象;
CLOSE <遊標名>
屬性: %NOTFOUND --若是FETCH語句失敗,則該屬性爲"TRUE",不然爲"FALSE";
%FOUND --若是FETCH語句成果,則該屬性爲"TRUE",不然爲"FALSE";
%ROWCOUNT --返回遊標當前行的行數;
%ISOPEN --若是遊標是開的則返回"TRUE",不然爲"FALSE";
使用:
LOOP循環
DECLARE
cursor c_1 select * from emp;
r c_1%rowtype;
begin
if c_1%isopen then
close c_1;
end if;
open c_1;
dbms_output.put_line('行號 姓名 薪水');
LOOP
FETCH c_1 into r;
exit when c_1%notfound;
dbms_output.put_line(c_1%rowcount||' '||r.ename||' '||r.sal);
end loop;
end;
for循環使用遊標是在循環開始前自動打開遊標,而且自動取值到循環結束後,自動關閉遊標.
遊標加鎖實例
declare
cursor c_1 is select ename,sal from emp for update of sal;
begin
dbms_output.put_line(行號 姓名 薪水);
for i in c_1
loop
update emp set sal=sal + 1000 where curent of c_1;
end loop;
for i in c_1
loop
dbms_output.put_line(c_1%rowcount||' '||i.ename||' '||i.sal):
end loop;
end;
代參數的遊標
定義:CURSOR <遊標名>(參數列表) IS <SELECT 語句> [FOR UPDATE | FOR UPDATE OF 字段];
示例:
DECLARE
cursor c_1(name emp.ename%type) is select ename,sal from emp where ename=name; --定義遊標
BEGIN
dbms_output.put_line('行號 姓名 薪水');
FOR i IN c_1('&name') --for循環中的循環變量i爲c_1%rowtype類型;
LOOP
dbms_output.put_line(c_1%rowcount||' '||i.ename||' '||i.sal); --輸出結果,須要 set serverout on 才能顯示.
END LOOP;
END;

PL/SQL表

PL/SQL記錄類型:

REF遊標:

過程:
定義:create or replace procedure《過程名》[(參數列表)] is
局部變量聲明
begin
可執行語句
exception
異常處理語句
end 過程名;
變量的類型:in 爲默認類型,表示輸入; out 表示只輸出;in out 表示即輸入又輸出;
操做以有的過程:在PL/SQL塊中直接使用過程名;在程序外使用execute <過程名>[(參數列表)]
create or replece procedure p_1(n in out number) is
r emp%rowtype;
begin
dbms_output.put_line('姓名 薪水');
select * into r from emp where empno =n;
dbms_output.put_line(r.ename||' '||r.sal);
n:=r.sal;
end;
declare
n number;
begin
n:=&請輸入員工號:
p_1(n);
dbms_output.put_line('n的值爲 ’||n);
end;
刪除過程:
drop procedure <過程名>;
函數:
create or replace function <過程名>[參數列表] return 數據類型 is
局部變量聲明
begin
可執行語句
exception
異常處理語句
end <過程名>;
變量的類型:in 爲默認類型,表示輸入; out 表示只輸出;in out 表示即輸入又輸出;
create or replace function f_1 (n number) return number is
r emp%rowtype;
begin
dbms_output.put_line('姓名 薪水');
select * into r from emp where empno =n;
dbms_output.put_line(r.ename||' '||r.sal);
return r.sal;
end;
declare
n number;
m number;
begin
n:=&請輸入員工號:
m:=f_1(n);
dbms_output.put_line('m的值爲'||m);
end;

drop function <函數名>;

數據包:
create or replace package <數據包名> AS
----公共類型和對象聲明
----子進程說明
end;
定義包的主體
create or replace package body <數據包名> as
----公共類型和對象聲明
----子進程說明
begin
--初始化語句
end;
建立數據包規範:
create or replace package p_1 as
n number;
procedure p_1;
function f_1 return number;
end;
建立數據包主體:
create or replace package body pack_1 as
procedure p_1 is
r emp%rowtype;
begin
select * into r from emp where empno =7788;
dbms_output.put_line(r.empno||' '||r.ename||' '||r.sal);
end;
function f_1 return number is
r emp%rowtype;
begin
select * into r from where empno=7788;
return r.sal;
end;
end;
使用包:
declare
n number;
begin
n:=&請輸入員工號:
pack_1.n:= n;
pack_1.p_1;
n:=pack_1.f_1;
dbms_output.put_line('薪水爲'||n);
end;

create or replace package body pack_2 as
type c_type is ref cursor;
procedure p_1(c_1 in out c_type);
end;

create or replace package body pack_2 as
procedure p_1(c_1 in out c_type) is
begin
open c1 for select * from emp;
end;
end;
var c_1 refcursor;
set autoprint on;
execute pack_2.p_1(:c_1);
drop package <包名>;

觸發器:
建立觸發器:
create or replace trigger <觸發器名>
before|after|insert|delete|update of [列名] on 《表名》
for each row;
where <條件>
<PL/SQL塊>
alter trigger <觸發器名> disable;
alter trigger <觸發器名> enable;
alter trigger <觸發器名> disable add triggers;
alter trigger <觸發器名> enable all triggers;
刪除觸發器
drop trigger <觸發器名>;

自定義對象:
create or replace type <對象名> as object(
屬性1 類型
屬性2 類型


)
其餘:
1.在PL/SQL中使用DDL
將sql語句賦給一個varchar2變量,在用execute immediate 這個varchar2變量便可;
declare
str varchar2(200);
begin
str:='create table test(id number,name,varchar2(20))';
execute immediate str;
str:='insert into test values(3,"c")';
execute immediate str;
end;

2.判斷表是否存在;
declare
n tab.tname%type;
begin
select tname into n from tab where tname='&請輸入表名';
dbms_output.put_line('此表已存在');
exception
when no_data_found then
dbms_output.put_line('尚未此表');
end;
2.查看以有的過程;
select object_name,object_type status from user_objects where object_name="PROCEDURE";

附錄:
oracle 的數據類型:
數據類型 描述
VARCHAR2(size) 可變長度的字符串,其最大長度爲size個字節;size的最大值是4000,而最小值是1;你必須指定一個VARCHAR2的size;
NVARCHAR2(size) 可變長度的字符串,依據所選的國家字符集,其最大長度爲size個字符或字節;size的最大值取決於儲存每一個字符所需的字節數,其上限爲4000;你必須指定一個NVARCHAR2的size;
NUMBER(p,s) 精度爲p而且數值範圍爲s的數值;精度p的範圍從1到38;數值範圍s的範圍是從-84到127;
例如:NUMBER(5,2) 表示整數部分最大3位,小數部分爲2位;
NUMBER(5,-2) 表示數的整數部分最大爲7其中對整數的倒數2位爲0,前面的取整。
NUMBER 表示使用默認值,即等同於NUMBER(5);
LONG 可變長度的字符數據,其長度可達2G個字節;
DATE 有效日期範圍從公元前4712年1月1日到公元后4712年12月31日
RAW(size) 長度爲size字節的原始二進制數據,size的最大值爲2000字節;你必須爲RAW指定一個size;
LONG RAW 可變長度的原始二進制數據,其最長可達2G字節;
CHAR(size) 固定長度的字符數據,其長度爲size個字節;size的最大值是2000字節,而最小值和默認值是1;
NCHAR(size) 也是固定長度。根據Unicode標準定義
CLOB 一個字符大型對象,可容納單字節的字符;不支持寬度不等的字符集;最大爲4G字節
NCLOB 一個字符大型對象,可容納單字節的字符;不支持寬度不等的字符集;最大爲4G字節;儲存國家字符集
BLOB 一個二進制大型對象;最大4G字節
BFILE 包含一個大型二進制文件的定位器,其儲存在數據庫的外面;使得能夠以字符流I/O訪問存在數據庫服務器上的外部LOB;最大大小爲4G字節.

函數:
字符函數:
concat(字符串1,字符串2)
select concat(job,ename) from emp;
lpad(字段,總的大小,填充字符);
rpad(字段,總的大小,填充字符);
lower();
upper();
initcap();首字母大寫,其他小寫
length();
substr(字符串,開始位置,長度);
instr(字符串,字符);
trim(字符 from 字符串);
to_char();
replace(字符串,字符串1,字符串2);
translate();
ascii(char);

數學函數:
nlssort(字符串);
abs(數字);
cell(數字);
floor(數字);
mod(被除數,除數);
round(數字,從第幾位開始取);
sign(數字);
sqrt(數字);
power(m,n);
trunc(數字,從第幾位開始);
greatest(數字列表);
sin(n);
cos(n);
tan(n);
acos(n);
atan(n);
exp(n):
ln(n);
log(m,n);

日期函數:
add_months(日期,數字);
last_day(日期);
months_between(日期1,日期2);
new_time(時間,時區,'gmt');
next_day(d,char);

其它函數:
vsize(類型);
nvl(字符串,替換字符);

經常使用命令:
desc 表名;
set serverout on|off
set pagesize 大小
set linesize 大小
set autoprint on|off
select sysdate from dual;
alter session set nls_date_format='格式';
select * from tab;
show user;
help topic;
save file_name
run file_name
get file_name
list
ed
del 行數
del 開始行 結束行
input 字符串
append 字符串1
C/之前的字符串/替換的字符串
connect
disconnect
quit
exp
imp

異常類型:CURSOR_ALREADY_OPEN 試圖"OPEN"一個已經打開的遊標 DUP_VAL_ON_INDEX 試圖向有"UNIQUE"中插入重複的值 INVALID_CURSOR 試圖對以關閉的遊標進行操做 INVALID_NUMBER 在SQL語句中將字符轉換成數字失敗 LOGIN_DENIED 使用無效用戶登錄 NO_DATA_FOUND 沒有找到數據時 NOT_LOGIN_ON 沒有登錄Oracle就發出命令時 PROGRAM_ERROR PL/SQL存在諸如某個函數沒有"RETURN"語句等內部問題 STORAGE_ERROR PL/SQL耗盡內存或內存嚴重不足 TIMEOUT_ON_RESOURCE Oracle等待資源期間發生超時 TOO_MANY_ROWS "SELECT INTO"返回多行時 VALUE_ERROR 當出現賦值錯誤 ZERO_DIVIDE 除數爲零

相關文章
相關標籤/搜索