Oracle筆記(三)

[第六章 數據庫分區技術]

一、什麼是數據分區?
  數據分區是指把一個表劃分成若干小塊。在創建表的結構時應考慮好分區方案,選擇表中某一列或多列數據作爲分區關鍵字,該關鍵字決定哪些數據分到哪些區。Oracle對分區進行管理,新插入數據自動存儲到相應的分區。

二、創建分區表:

SQL> Create table employee (
 id number(7),
 name varchar2(20),
 sal number(7,2))
 Partition by range(sal)
 (Partition p1 values less than(500) tablespace users,
 Partition p2 values less than(800) tablespace tools,
 partition p3 values less than(1000) tablespace system);

// p1, p2, p3是三個分區的名字,users, tools, system是三個表空間的名字。less than是小於(不包含)。
幾點說明:
[.] 所插數據不得大於LESS THAN中的最大值
[.] 可以使用MAXVALUE(如上面的語句中,要求工資不能大於1000,如果出現這種情況,則應該改成下面的語句:
SQL> Create table employee (
 id number(7),
 name varchar2(20),
 sal number(7,2))
 Partition by range(sal)
 (Partition p1 values less than(500) tablespace users,
 Partition p2 values less than(800) tablespace tools,
 partition p3 values less than(1000) tablespace system,
 partition p4 values less then(maxvale) tablespace users);
 
[.] 不指定表空間時,則該區使用該用戶的缺省表空間。
* 查詢每個用戶的用戶缺省表空間:
SQL> select username, default_tablespace from dba_users; // 使用dba用戶查詢

[*]查詢可以使用的表空間名字:
SQL> select tablespace_name, file_name from dba_data_files; // 使用dba(sys或system)來執行

SQL> select dba_users.username, dba_users.default_tablespace, dba_data_files.file_name
 from dba_users, dba_data_files
  where dba_users.default_tablespace = dba_data_files.tablespace_name;

[temp表空間不能用於數據分區。]

三、分區表的查詢方法:
SQL> select * from employee;   // 按沒有分區的方法查詢

SQL> select * from employee partition(p1);   // 只查詢p1分區的數據。
SQL> create table part3 as select * from employee partition(p3);

四、分區表的修改:
1、增加分區:
SQL> Alter table employee ADD
 partition p4 values less than(1500) tablespace users;

[*]分區數據字典:
SQL> select partition_name, high_value, tablespace_name
 from user_tab_partitions
 where table_name = 'EMPLOYEE';
 
2、刪除分區:
SQL> Alter table employee DROP partition p4;   // 結構數據全部刪除(相應分區及數據全部被刪除)
SQL> Alter table employee TRUNCATE partition p4;  // 保留結構(即區還存在),數據刪除

3、修改區名:
SQL> Alter table employee RENAME partition p4 to p5;

4、分區數據移動:將分區數據從一個表空間移動到另一個表空間
SQL>Alter table employee MOVE partition p4 tablespace system;

5、分區的拆分:

SQL> Alter table employee SPLIT
 partition p3 at(900)
 into(partition p31, partition p32);
 
/* 關於數據字典的幾點說明:
v$打頭的數據字典,後面不會以s結尾,例如:V$database, v$session;
user打頭的,後面都會以s結尾(複數), 如:user_tab_partitions, user_tables
dba打頭的,有的以s結尾,有的不。
***************************************************************************/

6、分區的合併:
SQL> Alter table employee MERGE partitions p31, p32 into partition p3;


[第七章 SQL*Plus 報表功能]

/**********************  插入內容:數據字典的一些說明 *****************************
(1) user_XXX:用戶,例如:user_tables
(2) dba_XXX: DBA專用
(3) all_XXX: 本用戶建的,或者其它用戶創建本用戶可以查詢的(需要其它用戶的授權)
(4) v$XXX: 動態數據字典,如:v$database, v$instance, v$session,這些數據字典在oracle不啓動時也能查詢
***********************************************************************************/
一、定義表頭與表尾
SQL> ttitle '表頭'

SQL> btitile '表尾'

失效:SQL> ttitle off
 SQL> btittle off

二、定義列名
語法:SQL> column 列名 heading 別名   // 別名不區分大小寫

三、定義列格式:
SQL> column 列名 Format 格式
常用列格式:An :  A爲字符,n爲最大字符寬度。

$99.9999.99
9.99eeee

例:SQL> Column sal format $99.9999.99
SQL> Column comm like Sal

四、分組命令:
語法:SQL> break on 列名 skip n
例:SQL> break on deptno skip 2
SQL> select * from emp order by deptno;

五、統計計算:
語法:SQL> compute 函數 of 統計列 on skip n  //可以使用的函數有:sum, max, min, avg,count, var(斜方差), std(標準差)
例:SQL> compute sum of sal on deptno
清除命令:SQL> clear compute
  SQL> clear break
  SQL> clear column


增加報表級統計:
SQL> break on deptno on REPORT
SQL> compute sum of sal on report
// 整個報表出一個結果,上面兩行都要運行,那麼整個報表會根據你的設置出一個sum of sal的總計結果。


[第八章 函數]

一、日期格式轉換函數:to_char(日期變量,'格式')  // 格式要用單引號括起來

(1) 日期格式構成方法:

  年   月   日   時    分  秒
  yy    mm   dd   hh(12小時制)  mi  ss
  yyyy   mon   dy(星期)  hh24(24小時制)
     month  day  
 
A. yy.mm.dd, yy/mm/dd, yy-mm-dd, yyyy.mm.dd, ... 加中文也可以,中文要用又引號括起來

SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;  // dual是一個虛擬表,任何用戶都可以使用。

二、聚組函數:從一組中返回彙總信息
聚組函數有:Sum, count, count distinct, max, min, avg, stddev(標準差)

例:SQL>select min(sal), max(sal), avg(sal), sum(sal) form emp;
SQL> select ename, job, sal from emp where sal=(slect max(sal) from emp);
SQL> select count(*) from emp;
.....[請參考PowerPiont教程:SQL講稿.ppt]


[第九章 複雜查詢]


一、連接查詢:
問:Smith在哪裏工作?
答:SQL> select loc from dept, emp where ename = 'SMITH' and emp.deptno = dept.deptno;

二、集合查詢[請參考PowerPiont教程:SQL講稿.ppt P29,30,31]
集合操作是將多個基表的查詢結果作UNION運算。
交操作: Intersect
差操作:MINUS


三、子查詢(Subqueries):
子查詢是在where子句中包含的查詢語句,是由系列簡單構成的複雜查詢。

問:誰與smith在同一部門工作?
答:SQL> select deptno from emp where ename = 'SMITH';
SQL> select ename from emp where deptno = 20;

將兩個語句合起來:Select ename from emp where deptno = ( select deptno from emp where ename = 'SMITH');


[第十章 Oracle 權限設置]

一、權限分類:
系統權限:系統規定用戶使用數據庫的權限。(系統權限是對用戶而言)。

實體權限:某種權限用戶對其它用戶的表或視圖的存取權限。(是針對表或視圖而言的)。

二、系統權限管理:
1、系統權限分類:
DBA: 擁有全部特權,是系統最高權限,只有DBA纔可以創建數據庫結構。

RESOURCE:擁有Resource權限的用戶只可以創建實體,不可以創建數據庫結構。

CONNECT:擁有Connect權限的用戶只可以登錄Oracle,不可以創建實體,不可以創建數據庫結構。

對於普通用戶:授予connect, resource權限。
對於DBA管理用戶:授予connect,resource, dba權限。

2、系統權限授權命令:
[系統權限只能由DBA用戶授出:sys, system(最開始只能是這兩個用戶)]
授權命令:SQL> grant connect, resource, dba to 用戶名1 [,用戶名2]...;

[普通用戶通過授權可以具有與system相同的用戶權限,但永遠不能達到與sys用戶相同的權限,system用戶的權限也可以被回收。]

例:
SQL> connect system/manager
SQL> Create user user50 identified by user50;
SQL> grant connect, resource to user50;

查詢用戶擁有哪裏權限:
SQL> select * from dba_role_privs;
SQL> select * from dba_sys_privs;
SQL> select * from role_sys_privs;

刪除用戶:SQL> drop user 用戶名 cascade;  //加上cascade則將用戶連同其創建的東西全部刪除

3、系統權限傳遞:
增加WITH ADMIN OPTION選項,則得到的權限可以傳遞。

SQL> grant connect, resorce to user50 with admin option;  //可以傳遞所獲權限。

4、系統權限回收:系統權限只能由DBA用戶回收
命令:SQL> Revoke connect, resource from user50;

系統權限無級聯,即A授予B權限,B授予C權限,如果A收回B的權限,C的權限不受影響;系統權限可以跨用戶回收,即A可以直接收回C用戶的權限。

三、實體權限管理
1、實體權限分類:select, update, insert, alter, index, delete, all  //all包括所有權限
execute  //執行存儲過程權限

user01:
SQL> grant select, update, insert on product to user02;
SQL> grant all on product to user02;

user02:
SQL> select * from user01.product;

// 此時user02查user_tables,不包括user01.product這個表,但如果查all_tables則可以查到,因爲他可以訪問。


3. 將表的操作權限授予全體用戶:
SQL> grant all on product to public;  // public表示是所有的用戶,這裏的all權限不包括drop。

[實體權限數據字典]:
SQL> select owner, table_name from all_tables; // 用戶可以查詢的表
SQL> select table_name from user_tables;  // 用戶創建的表
SQL> select grantor, table_schema, table_name, privilege from all_tab_privs; // 獲權可以存取的表(被授權的)
SQL> select grantee, owner, table_name, privilege from user_tab_privs;   // 授出權限的表(授出的權限)

4. DBA用戶可以操作全體用戶的任意基表(無需授權,包括刪除):
DBA用戶:
SQL> Create table stud02.product(
 id number(10),
 name varchar2(20));
SQL> drop table stud02.emp;

SQL> create table stud02.employee
 as
 select * from scott.emp;
 
5. 實體權限傳遞(with grant option):
user01:

SQL> grant select, update on product to user02 with grant option; // user02得到權限,並可以傳遞。

6. 實體權限回收:
user01:
SQL>Revoke select, update on product from user02;  //傳遞的權限將全部丟失。


四、同義詞(Synonym):

1、創建私有同義詞:
語法:SQL> create synonym 同義詞名 for 代替項;

user01:
SQL> grant select, upate on product to user02;

user02:
SQL> Create synonym product for user01.product;

SQL> select * from product;  // 這裏的product即user01.product。

同義詞數據字典:
SQL> select synonym_name, owner, table_name from all_synonyms;
SQL> select synonym_name, table_name from user_synonyms;

2、DBA可以創建公共同義詞(Public Synonym):公共同義詞全體用戶可以存取
語法:SQL> create public synonym 公共同義詞名 for 代替項;

SCOTT:
SQL> grant select on payment to public;

SYSTEM:
SQL> create public synonym payment for scott.payment;


3. 刪除同義詞:
User:SQL> drop synonym 私有同義詞名;

DBA: SQL> drop public synonym 公共同義詞名;


[PL/SQL程序設計]

一、PL/SQL概述
PL/SQL塊結構:
Declare
 -- 變量定義部分
Begin
 -- 可執行語句
Exception
  -- 例外處理:對於程序運行中的錯誤信息、警告信息的說明
End;
.  // 以.號結束程序編寫

二、PL/SQL語言的特點(參考PowerPoint教程)
1. PL/SQL中可以定義變量,變量有其作用範圍。
2. PL/SQL是以塊的方式設計,塊中可以嵌套子塊,子塊可以位於塊中任何部分。
3.

x. PL/SQL是以塊爲單位,SQL語句以語句爲單位。

7. 減少對Oracle核心的訪問,降低網絡負載。

三、PL/SQL與SQL語言(參考PowerPoint教程)
1. PL/SQL語句不能使用DDL語句。
可以使用的SQL語句:Insert, Update, Delete, [select into], commit, rollback, savepoint

...

四、PL/SQL基礎
1. 變量的使用
2. 單行註釋:--
  多行註釋:/*   */

3. 數據類型:
(1)布爾型: Boolean(TRUE, FALSE, NULL)
(2)數字型:NUMBER
INT = INTEGER

(3) 字符型,基本上沒有變化
(4) 日期型
(5) 二進制數據:raw, blob

4. 數據定義:
 變量名 數據類型
 變量名 數據類型:=初始值

5. 變量賦值:變量 := 值;

[*]%TYPE:數據類型匹配

s1 char(20);
s2 s1%TYPE; // 定義s2變量,其類型與s1完全匹配。

v_sal emp.sal%type;  // v_sal變量的類型與emp表中的sal字段的數據類型完全匹配,%TYPE最經常使用的方法

[*] %ROWTYPE: 行類型,用於存儲數據庫基表的一條記錄。
定義方法:變量 基表名%rowtype;

例:
SQL> set serveroutput on  // 使能屏幕打印函數的輸出

Declare // 如果PL/SQL程序中沒有定義變量,那麼Declare可以省略
 v_empno emp.empno%type := &empno;
 r emp%rowtype;
Begin
 select * into r from emp where empno = v_empno;
 dbms_output.put_line('姓名'|| r.ename||'工資'||r.sal||'日期'||r.hiredate); 
 // r.字段名:表示某一列的值;dbms_output.putline()是一個屏幕打印函數
End;


[*] 記錄類型Record:
 record:
Declare
 v_empno emp.empno%type := &empno;
 // 定義record類型
 type r_emp is record(
  v1 emp.ename%type,
  v2 emp.job%type,
  v3 emp.hiredate%type);
 
 r r_emp;   -- 定義變量r爲record類型r_emp
Begin
 select ename, job, hiredate into r from emp where empno = v_empno;
 dbms_output.put_line('姓名:'|| r.v1||'職務:'||r.v2||'工作時間:'||r.v3);
End;

[*] Table類型:類似於C語言中的結構類型數組:
定義方法:TYPE [table_emp] is Table of [emp.ename%type] index by binary_integer;  // []內爲用戶可以修改的部分

使用:mytable = table_emp;
 mytable(0) := 'SCOTT';
 ...
例:
Declare
 v_empno emp.empno%type := &empno;
 type t_emp is table of emp.ename%type index by binary_integer;
 
 t t_emp;
Begin
 select ename into t(10) from emp where empno = v_empno;
 dbms_output.put_line('編碼爲'||v_empno||'的員工是'||t(10));
End;

五、條件控制語句:條件判斷語句
1. IF-THEN語句:
IF 條件成立 THEN
 可執行語句; 
END IF;

Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
    Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
      if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
       dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
      End if;
    End;
   

2. IF-THEN-ELSE語句

IF 條件成立 THEN 
 執行語句1;
ELSE
 執行語句2;
END IF;

Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
      if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
       dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
      Else dbms_output.put_line('員工'||v_ename||'的工資已經超過規定值,不予更新!');
      End if;
End;
 
3. IF-THEN-ELSIF語句
     IF       條件1成立  THEN  執行語句1;
     ELSIF 條件2成立  THEN   執行語句2;
     ELSIF 條件3成立  THEN   執行語句3;
     ...
     END  IF;
    
Declare
       v_empno emp.empno%type :=&empno;
       v_ename emp.ename%type;
       v_sal emp.sal%type;
    Begin
      select sal,ename into v_sal,v_ename from emp
      where empno=v_empno;
       if v_sal<2000 then Begin
                  update emp set sal=sal+100
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        elsif v_sal<2500 then Begin
                  update emp set sal=sal+50
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        elsif v_sal<3000 then Begin
                  update emp set sal=sal+10
                  where empno=v_empno;
        dbms_output.put_line('員工'||v_ename||'工資已經修改!');
                                       End;
        else dbms_output.put_line('員工'||v_ename||'的工資已經超過規定值,不予更新!');
        End if;
    End;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章