天天看點

Oracle SQL語句梳理

一、語句分類

  1. DML(Date Manipulation Language)資料操縱語句,查詢、修改表中的資料
    SELECT 查詢資料庫表或視圖資料  
    INSERT INTO 新增資料至表或視圖    
    DELETE 删除表或視圖中的資料    
    UPDATE    修改表或視圖中的資料   
               
    注意:DML語句不會自動送出事務,是以如果是增删改操作的話需要在後面加入commit才能送出事務
  2. DDL(Date Definition Language)資料定義語句,建立、删除、修改表
    CREATE TABLE 建立表     
    ALTER TABLE 對表名、字段名、字段類型進行修改     
    DROP TABLE 删除表
               
    注意:DDL語句會自動送出事務,是以DML語句可以進行復原,但DDL不能進行復原
  3. DCL(Data Control Language)資料控制語句,用于使用者權限的授予和收回
    GRANT 給使用者授予權限    
    REVOKE 撤銷使用者權限
               
  4. TCL(Transaction Control Language)事務控制語句,維護資料的一緻性
    COMMIT 送出已經進行的資料庫改變      
    ROLLBACK 復原已經進行的資料庫改變    
    SAVEPOINT 在事務上下文中設定儲存點,友善定點復原到該點
               

二、語句具體操作

1.DDL

--簡單建表語句
create table test_a 
(one varchar2(),two varchar2(),three number());
--一般建表語句(包含主鍵,空值,非空值,指定表空間)
create table test
(
id number() not null  primary key,
one varchar2() not null,
two varchar2() default 'two',
three varchar2(),
four number()
)
tablespace users

           
--修改表名
alter table test_a rename to test;
--修改字段名字
alter table test rename column tow to two;
--修改多個字段名字
alter table test rename column (two_new to two,three to three_new);
           
--修改字段類型
alter table test modify three number();
--修改多個字段類型
alter table test modify (three varchar2(),four number());
           
--增加字段
alter table test add (one varchar2(),five varchar2());
alter table test add four varchar2();
--删除字段
alter table test drop column one;
alter table test drop (one,five);
           
--删除表
drop table test;
           

2.DML

--插入所有資料
insert into test values('a','b',,'c','d');
--插入部分資料
insert into test(two,four) values(,);
           
--删除資料
delete test where three=
--更新資料
update test set one='one' where three=;
           
--查詢資料
select three, count(*)
  from test
 where one = 'a'
 group by three
 order by three desc;
           

3.DCL

--授予DBA權限給使用者
grant dba to test
--撤銷使用者的DBA權限
revoke dba from test
--儲存這個事務點
savepoint a
--復原到儲存過的事務點
rollback to a
           

注意:復原隻能對未送出的操作,如果已經送出過的操作會清除儲存的事務點,是以如果是對DDL操作和授權、撤銷權限等操作設定事務點事沒有意義的

4.TCL

--送出事務
commit
--復原所有事務
rollback
--復原到某個事務點,該事務點後的操作将被清除
rollback a
           

三、PL/SQL

PL/SQL(Precudual Language/SQL)是一種建構在SQL之上的過程化語言,也就是說可以在編寫的時候可以引進一些流程控制,比如if,case,while,for等。

基本結構如下:

DECLARE
    --聲明部分,可選
BEGIN
    --執行部分,必選
EXCEPTION
    --異常處理部分,可選
END;
/
           

1.資料類型

普通的varchar2,number都有,另有三個特殊的資料類型

  • %TYPE 根據標明字段确定資料類型
  • RECORD 存儲標明的一行字段,需要先定義記錄的字段成員
  • %ROWTYPE 結合上面兩個的特定,可以根據標明表确定各自字段的資料類型

2.常量與變量的定義

【變量名】【變量類型】【變量長度:=初始值】

【常量名】constant【常量類型】:=常量值

3.流程控制

條件判斷

if condition then
    語句;
elseif condition then
    語句;
end if;
           
case a
when A then
    語句;
when B then 
    語句;
else
    語句;
end case;
           

循環

loop
    語句;
    exit when condition;
end loop;
           
while condition loop
    語句;
end loop;
           
for i in I loop
    語句;
end loop;
           

4.遊标

顯示遊标需要在聲明中聲明遊标,它的主要步驟包括聲明遊标,打開遊标,讀取遊标和關閉遊标4個步驟

declare
    cursor c is select a(var_a in varchar2='A') from dual;
    i varchar2;
begin
    open c('A');
    fetch c into i;
    close c;
end;
/
           

遊标的屬性:

%found 布爾型,如果sql語句影響到了至少一行資料,那麼就傳回true;
%notfound 布爾型,遇上面的相反;
%rowcount 數字屬性,傳回SQL語句影響的行數
%isopen 布爾型,遊标打開傳回ture,關閉則傳回false
           

而隐示遊标是在BEGIN的執行語句時oracle自動建立的一個遊标,如果使用它的屬性,需要在前面加上sql

通過for循環不需要進行打開、關閉遊标等操作也可以通路遊标資料

for i in cursor_c loop
    sql;
end loop
           

5.異常

常用的有

NO_DATA_FOUND

上面介紹的這些都是普通PL/SQL,都是匿名的,還有幾種命名的塊,其中包括過程、函數、觸發器

四、存儲過程

create or replace procedure name(var1 in type,var2 out type,var3 in out type) is
    i int:=;
begin
    執行語句;
end name;
/
           

存儲過程的特點就是可以傳遞參數,一共有三種參數傳遞方式

in 隻可以傳入參數
out 隻可以傳出參數,并且在調用過程的時候要預先定義變量接受傳出的參數
in out 在程式開始的時候傳入參數,結束的時候傳出參數
           

五、函數

create or replace function name (var1 type) return type is
    i int:=
begin 
    函數
    return ..
end;
/
           

函數也可以接受參數,但是與存儲過程不同的是它必須定義傳回的類型和在執行語句中傳回值,是以同樣的在調用函數的時候需要預先定義變量接收函數的傳回值

六、觸發器

  • 語句級觸發器:針對一條DML語句而引起的觸發器,也就說無論語句影響了多少行,觸發器值執行一次
  • 行級觸發器:DML語句的每一行都會引起的觸發器執行一次
  • 替換觸發器:instead of,關鍵字與上面兩個不同,而且它是定義在視圖上的,目的是對視圖中的各個基表記性操作
  • 使用者事件觸發器:因為DDL或登入、退出等操作引起的觸發器

七、程式包

程式包包括兩部分:規範,包體

規範

create or replace package package_name is 
    各部分的聲明
end package_name;
           

包體就是各部分的内容