從零開始學習Oracle

分類:IT技術 時間:2016-10-10

目錄

(一)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<環境配置>

(二)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<基本語法解析>

(三)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<約束>

(四)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<內建函數>

(五)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<內建對象>

(六)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<性能對象>

(七)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<PL/SQL>

(八)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<異常處理>

(九)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。Oracle之<小經驗>

(一)、Oracle之<環境配置>

從零開始學Oracle—環境配置(一)

  一、開始前的準備

  1.啟動Oracle

   啟動監聽服務:OracleOraHome90TNSListener

   啟動實例服務:OracleServiceOrac

  2.Oracle系統用戶

   Oracle三大系統用戶

   默認用:system/welcome

   超級用戶:sys/welcome   權限最大

   普通用戶:scott/tiger

  3.登錄Oracle的方式

   Windows窗口下的sqlplus的操作    運行->sqlplus.exe 

   DOS下的sqlplus的操作               運行-> sqlplus.exe    

   登錄Oracle但不連接數據庫           運行->sqlplus /nolog

   connect 用戶名/密碼@主機連接字符串  連接到指定用戶

  4.Oracle常用操作

show user 查看當前用戶  
select table_name from user_tables;  查看當前用戶下的表
desc dept         查看表dept的結構
quit/exit         退出
clear screen        清除屏幕
set linesize 200      設置一行顯示200個字符
set pagesize 20      設置每頁顯示20行
spool 文件名 (spool c:abc.txt) 作日誌文件命令spool off
alter session set nls_date_format = 'yyyy-mm-dd'; 改日期的默認格式
conn /as sysdba    
select * from v$version;查看當前Oracle的版本
conn system/welcome
select * from v$tablespace; 查看表空間

  5.表空間  用戶 表三者的關系

   一個用戶可以使用一個或多個表空間,一個表空間也可以供多個用戶使用   

   用戶和表空間沒有隸屬關系。

   表空間是一個用來管理數據存儲邏輯概念,表空間只是和數據文件發生關系,數據文件是物理的,

   一個表空間可以包含多個數據文件,而一個數據文件只能隸屬一個表空間

  二、常規操作

  1.DDL語句(數據定義語言) Data Define Language

   create   alter    drop   truncate 開頭的語句 truncate table <表名>

   特點:<1>建立和修改數據對象

    <2>建立和修改直接存入庫中,直接生效

  創建表空間:Create tablespace Product  datafile 'D:testaa.DBF' size 100M

  刪除表空間:Drop tablespace Product

  創建用戶: Create user zhangsan identified by "welcome" default tablespace Product

  修改用戶: Alter  user zhangsan identified by "Hello"

  授予用戶連接的權限:  grant connect to zhangsan;

  撤銷用戶連接權限:   revoke connect from zhangsan;

  授予用戶在表空間創建對象的權限  

grant unlimited tablespace to zhangsan;
grant resource  to zhangsan;  

  系統特權:unlimited tablespace表示用戶可以在任意表空間中創建對象,且此權限只能授予用戶而不能授予角色

  resource角色:給用戶RESOUCE權限後,用戶就擁有在所有表空間上建表權限

  授予用戶zhangsan對Emp表增、刪、查、改的權限

grant  select  on scott.empa to y2;
          delete
          update
          insert
          all  (=select,delete,update,insert)

  with grant option 授予用戶權限,則接受權限的用戶可以將此權限授予其他用戶.

  (1).建表,並指定表空間

  示例: Create table tab1
          (
             no number(4),
             name varchar2(10)
          )tablespace Product;

  學生表  Student

       Create table student
       ( 
         xh number(4) primary key, --學號
         name varchar2(10) not null, --姓名
         sex  char(2)  check (sex in ('男','女')),--性別
         birthday date,--生日
         sal number(7,2), --獎學金
         classid number(2) references class(classid) --班級         
       ); 班級表class
         Create table class
         (
          classid number(2), --班級編號
          cname varchar2(20) --班級名字
         );

   添加字段(學生所在班級classid)

   alter table student add (classid number(2));

   修改字段的長度

   alter table student modify (xm varchar2(12)) ;

   修改字段的類型(不能有記錄的)

   alter table student modify (xh varchar2(5));

   刪除一個字段

   alter table student drop column sal;

   刪除表

   drop table student;

   表的名字修改

   rename student to stu;

   字段如何改名字

   --先刪除

   a)alter table student drop column sal;        

   --再添加

   b)alter table student add (salary number(7,2));

  Number數據類型的存儲範圍

  精度    存儲字節數

1 - 9       5
10-19     9
20-28    13
29-38    17

(二)、Oracle之<基本語法解析>

從零開始學Oracle—基本語法解析(二)
   1.Oracle數據操作語言 DML

  接上一篇:

  2. DML語句(數據操作語言) Data Manupilate Language     

   select
   insert
   delete
   update

   特點:<1>對數據起作用的

   <2> 這些語句的修改是在內存中發生的

   要想改動存入庫中必須要commit語句

  查看當前用戶的所有權限

select * from session_privs;

  查看當前用戶下的所有表

select * from tab where tabtype='TABLE';

  3. TCL(事務控制語句) Transaction Control Language

   commit;  提交  修改保存到數據庫中

   rollback; 回滾  取消內存中的改動

   savepoint;保存點 分解事務的 把事務變小

   DDL語句 會自動提交以前未提交的事務

   關閉SQLplus工具 也會自動提交未提交的事務的

   事務 -- 就是一個完整的對數據的DML操作

   所有事務 都是要明確的提交和回滾的

   --轉賬 

    update 賬目表
    set 錢=錢-500
    where 帳號='A';
    update 賬目表
    set 錢=錢+500
    where 帳號='B';
    commit;

   事務何時存在 DML語句中除select以外都會有事務

  《《《《《《《註意》》》》》 / 重復運行上一條SQL語句  

   commit;    結束上一個事務 並且開始一個新的事務

   update student set sal = null where xh =1000;

   savepoint c111;

   insert into student(xh,name,sex) values (1004,'MIKE','男');

   rollback to c111; --撤銷了插入的數據

   rollback;  --從c111這個點回滾到事務的開始點

  《SQLPLUS規則》  

   a)DML語句後跟上DDL語句 DML語句的事務會被自動提交

   b)exit/quit命令 退出 SQLPLUS環境時也會自動提交事務

   點小叉子關閉sqlplus窗口 事務都自動回滾了

   c)非法操作是不能提交事務的 ,只能導致事務回滾

  《4》 DCL語句(數據控制語句) Data Control Language                    grant 授予權限

   revoke 撤銷權限

   權限 select ,insert,delete,update

   all (select ,insert,delete,update 總和)

   角色 connect (登陸數據庫),resource(建立表和對象)

   如何建一個自己的用戶?

   必須是超級用戶才能建用戶

     --連接到超級用戶
     connect system/manager
     --建立用戶名zhangsan 密碼m123
     create user zhangsan identified by m123;
     --授予必要的權限connect 你能夠連接
                    resource 你能建表不受空間的限制,建立對象
     grant connect,resource to zhangsan;
     --這個普通用戶就建好了 和scott用戶的權限是一樣的     
     grant DBA to zhangsan; --張三的權限和System一樣

   --改張三的密碼

   <<1>> 自己改自己的密碼

        connect zhangsan/m123

   密碼改為了mm1  

        alter user zhangsan identified by mm1;

   <<2>> 超級用戶來改

        connect system/manager
        alter user zhangsan identified by mm1; 

(三)、Oracle之<約束>

從零開始學Oracle-—約束(三)
  給表添加約束

   主鍵約束 --  每個表要有主鍵,唯一的標識一行數據

   非空約束

   唯一性約束

   外鍵約束

   檢查約束

  查看一個表的約束:

      select constraint_name,constraint_type
      from user_constraints
      where table_name = '表名'

  查看約束作用於那個字段:

     select * from user_cons_columns
     where CONSTRAINT_NAME='約束名;

  1.建立表的同時使用約束

        create table student( --學生表
           xh number(4) primary key, --學號主鍵
           xm varchar2(10) not null, --姓名不能為空
           sex char(2)  check (sex in ('男','女')), --性別
           birthday date unique, --日期
           sal number(7,2) check (sal between 500 and 1000),--獎學金 sal >=500 and sal <=1000
           classid number(2) references cla(id)
        );  --必須要先有cla表才對
            --一定先建立班級cla表

  2.建立約束的同時給約束指定名字,便於刪除

        create table stu( --學生表
          xh number(4) constraint pk_stu primary key, --學號是主鍵
          xm varchar2(20) constraint nn_stu not null, --姓名非空
          age number(2) constraint ck_stu check (age between 10 and 90),
          birthday date,
          shenfenzheng number(18) constraint uq_stu unique, --身份證唯一 
          classid number(2) constraint fk_stu references cla(id) -- 班級編號外鍵
           --(引用的一定是另外表的主鍵或唯一性約束的字段)
         );

  3.建完表後加約束

  添加主鍵約束:alter table student add constraint pk_stu primary key (xh);

  添加非空約束:alter table student modify (xm not null);

  檢查約束:

alter table student add check(sex in ('男','女'));
alter table student add constraint ck_sal check(sal between 500 and 1000));
添加外鍵約束:    alter table student add constraint fk_stu  foreign key (classid) references cla(id);
添加唯一約束:  alter table student add constraint  uq_sfz unique(shenfenzheng);

  4.刪除約束:

  格式:alter table 表名 drop constraint 約束名
     alter table student drop constraint  fk_stu;

(四)、Oracle之<內建函數>

從零開始學Oracle—內建函數(四)
SQL函數
單行函數: 返回值只有1個,可以出現在Select子句或Where子句中
分組函數: 返回值是多條記錄

一。單行函數:
1.ASCII
返回與指定的字符對應的十進制數;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;

A A ZERO SPACE
--------- --------- --------- ---------
65 97 48 32

2.CHR
給出整數,返回對應的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;

ZH C
-- -
趙 A

3.CONCAT
連接兩個字符串;
SQL> select concat('010-','88888888')||'轉23' 高乾競電話 from dual;

高乾競電話
----------------
010-88888888轉23

4.INITCAP
返回字符串並將字符串的第一個字母變為大寫;
SQL> select initcap('smith') upp from dual;

UPP
-----
Smith

5.INSTR(C1,C2,I,J)
在一個字符串中搜索指定的字符,返回發現指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的開始位置,默認為1
J 出現的位置,默認為1
SQL> select instr('oracle traning','ra',1,2) instring from dual;

INSTRING
---------
9

6.length 返回字符串的長度;
7.LOWER 返回字符串,並將所有的字符小寫
8.UPPER 返回字符串,並將所有的字符大寫

9.RPAD和LPAD(粘貼字符)
RPAD 在列的右邊粘貼字符
LPAD 在列的左邊粘貼字符
SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;

LPAD(RPAD('GAO',1
-----------------
*******gao*******
不夠字符則用*來填滿

10.LTRIM和RTRIM
LTRIM(字符串,值) 刪除字符串左邊指定的值
RTRIM(字符串,值) 刪除字符串右邊指定的值
11.SUBSTR(string,start,count)
取子字符串,從start開始,取count個
12.REPLACE('string','s1','s2')
string 希望被替換的字符或變量
s1 被替換的字符串
s2 要替換的字符串
13.SOUNDEX
返回一個與給定的字符串讀音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values('weather');
SQL> insert into table1 values('wether');
SQL> insert into table1 values('gao');

SQL> select xm from table1 where soundex(xm)=soundex('weather');

XM
--------
weather
wether

14.ROUND和TRUNC
按照指定的精度進行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;

ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
56 -55 55 -55

15.Least('表達式1','表達式2','表達式3') 返回一組表達式中的最小值
16.TO_NUMBER 將給出的字符轉換為數字
17.TO_DATE(string,'format') 將字符串轉化為ORACLE中的一個日期
18.NEXT_DAY(date,'day') 給出日期date和星期x之後計算下一個星期的日期
19.MONTHS_BETWEEN(date2,date1) 兩個日期相差的天數
20.Decode(字段1,值1,結果1,值2,結果2...,默認值)
21.nvl(表達式1,表達式2) 表達式1為NULL,返回表達式2;不為NULL,返回表達式1。註意兩者的類型要一致
22.nvl2(a,b,c)
表達式1不為NULL,返回表達式2;
為NULL .返回表達式3。表達式2和表達式3類型不同的話,表達式3會轉換為表達式2的類型
23.nullif (expr1, expr2) ->相等返回NULL,不等返回expr1

分組函數
AVG([{DISYINCT|ALL}]) distinct去掉重復的數據 all所有數據
Max
SUM
Count 計數函數
count(*) 統計所有的行,包括重復的值和空值
count(col_name) 統計列中非空值的個數
count(distinct col_name) 統計列中除去空值和重復值的行數

分析函數:
作用:用於完成對聚集的累計排名,移動平均數和報表計算。
分析函數是查詢中執行的最後一組操作,只能出現在select列表或order by 字句
row_number() over([Partition by column] order by column) 返回唯一排序值

按工資排名:
select ename,job,deptno,sal,row_number() over(order by sal desc) as A from empa;

按部門分組再按工資排名
select ename,job,deptno,sal,row_number() over(Partition by deptno order by sal desc) as A from empa

rank() 計算一個值在一組值中的排位,排位從1開始,相等值的行排位相同,序數跳躍相應值.

select ename,sal,comm,deptno,rank() over(partition by deptno order by sal desc) from empa;
dense_rank() 計算一個行在一組有序行中的排位,排位從1開頭的連續整數,具有相等值,排位相同。排位是連續的。
select d.dname,e.ename,e.sal,dense_rank() over(partition by e.deptno order by e.sal desc) denserank
from empa a,dept d where e.deptno=d.deptno

(五)、Oracle之<內建對象>

從零開始學Oracle—內建對象(五)
  1.   序列

  查詢當前用戶下的序列:select * from user_sequences

  定義:用來生成唯一、連續的整數的數據庫對象,序列通常用來自動生成主鍵或唯一鍵的值、可升、可降序排列.

  語法:    Create  sequence 序列名稱   //從1開始 每次自動增加1 沒有最大值

   [start with 值]  指定要生成的第一個序列號,對於升序默認值為最小值、反之...

   [increment  by 值]   間隔數

   [maxvalue  值|nomaxvalue]  序列最大值,如果指定為nomaxvalue,則升序最大值為10的27次方,降序-1.

   [minvalue    值|nominvalue]  序列最小值,-----------------------升序為1,降序為10的負26次方

   [cycle|nocycle]   cycle指序列到達最大或最小時,將從頭開始生成值  nocycle值不在生成

   [cache  值|nocache]  預先分配一組序列號,將其保存在內存中. 默認緩存20個序列

  訪問序列方法:  currval 和nextval   --當前序列 select 序列名.currval from dual

  更改序列:Alter sequence 序列名

  刪除序列:drop sequence 序列名

  註意-------------序列使用時需要先用nextval輸出完以後再來使用

  使用:

  1.和表關聯作為表的字段的值
     a) create table student(
          xh number(4) primary key, --學號
          xm varchar2(20) not null --姓名
        );

        要求:學號字段 從1000開始每次增加4 最大值9999
         --建立序列
           create sequence xh_seq
                  start with 1000 --從1000開始
                  increment by 4  --每次增加4
                  maxvalue 9999   --最大值 9999
                  ;
         --使用SQL語句關聯
         insert into student values
             (xh_seq.nextval,'Mike');
         insert into student values
             (xh_seq.nextval,'John');
         insert into student values
             (xh_seq.nextval,'Rose');
    
      --特點:能產生唯一的值,但是不能保證值在表中的連續性
 
   b) create table teacher(
           teacherxh varchar2(10) primary key,
           teachername varchar2(20)
          );
     要求:教師的編號的格式是TH00001
                         TH00002
                          ....
     
   --建立序列
        create sequence teacher_seq
              maxvalue 99999;
   --
     insert into teacher values ('TH'||
       ltrim(to_char(teacher_seq.nextval,'00000')),
       '張三');
       insert into teacher values ('TH'||
       ltrim(to_char(teacher_seq.nextval,'00000')),
       '李');
      insert into teacher values ('TH'||
       ltrim(to_char(teacher_seq.nextval,'00000')),
       '王');
  2.視圖

  查看當前用戶下的視圖:select view_name from user_views;

  作用:隱藏數據,增加系統的安全性

語法:Create [or replace] [Force|noForce] veiw 視圖名 [(別名1,別名2...)]
         AS 子查詢
         [with check option [constraint 約束名]]
         [with read only]  視圖是只讀的

  其中:or replace 表示替代已經存在的視圖

   force 表示不管基表是否存在,創建視圖

   noforce 表示只有基表存在時,才創建視圖.

   別名是為子查詢中選中的列新定義的名字,替代查詢表中原有的列名。

   with check option 對視圖操作時必須滿足子查詢的約束條件。後面的約束名是該約束條件的名字

   刪除視圖者需要是視圖的建立者或者擁有DROP ANY VIEW權限。視圖的刪除不影響基表,不會丟失數據

  對視圖操作需滿足以下條件:

          <1>建立視圖的select語句必須是簡單的select語句
               簡單:不能是多表的查詢
                    不能有分組函數
           <2>建立視圖的時候不能帶with readonly關鍵字

  例:

create or replace view emp_v2
 as --select語句
  select empno,ename,sal from emp
  with read only;  --只讀視圖

  3.同義詞

  查看用戶創建的同義詞:select * from user_synonum;

  定義:數據庫對象的一個別名

  用途:1.簡化SQL

   2.隱藏對象名稱和所有者

   3.為分布式數據庫的遠程對象提供了位置透明度

   4.提供對象的公共訪問

  註意:使用同義詞前需要確保用戶得到訪問同義詞的權限

  同義詞分為:

  1.私有同義詞  --只能被當前用戶模式訪問  要在自身模式下創建須 Create synonum 權限

  2.共有同義詞  --須Create any synonym權限

  語法: Create [or replace] [public] synonym 同義詞名稱 for 要創建同義詞對象的名稱

  4.索引

  作用:加快查詢  索引一定是建立在表上的.

  語法:Create Index 索引名 on 表名(列名)

  創建唯一索引: Create unique Index 索引名 on 表名(列名)

  創建位圖索引: Create bitmap Index 索引名 on 表名(列名)

  數據的不同值對於記錄的行數來說 是個很小的數  這種字段適合使用位圖索引 它比普通索引效率高

  不能用索引的條件:

  <1>規則1:索引的字段不能參與運算

  <2>規則2:索引的字段上不能使用函數 

  5.簇

  定義:用於多表聯合查詢,提高數據查詢效率

1.簇的創建必須在創建表結構時指定
2.如果使用簇,則兩個表必須要有主外鍵關系

  簇的使用步驟:

1.創建簇    Create cluster 簇名稱(字段名 數據類型);
2.創建主鍵表使用簇
Create table depa (
    deptno number(2) primary key,
    dname varchar2(20)
 ) cluster 簇名(deptno);
3.創建外鍵表使用簇
Create table empa(
   empno number(4) primary key,
   ename varchar2(20)
   ) cluster 簇名(empno)
4.在簇上建立索引
Create Index  索引名 on cluster 簇名

(六)、Oracle之<性能對象>

從零開始學Oracle—性能對象(六)
  Oracle性能對象

  要點:分區必須是在創建表的結構時指定,分區方式一旦指定是不能改變的。

  分區方式:

  1 範圍分區

  2 散列分區

  3復合分區

  3列表分區

  表分區的優點:

  一、改善表的查詢性能

  二、表更容易管理,表的數據存儲在多個部分,按分區加載和刪除數據更快

  三、便於備份和恢復

  四、提高數據安全性

  -----------註意:要分區的表不能具有Long和Long raw數據類型

  範圍分區:根據表的某個列或一組列的值範圍,決定將數據存儲在那個分區

create table niegc_part
 (
 part_id integer primary key,
 part_date date,
 part_dec varchar2(100)
 )
 partition by range(part_date)--根據日期分區
(
  partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace dw1,

 partition part_02 values less than(to_date('2007-01-01','yyyy-mm-dd')) tablespace dw2,

  partition part_03 values less than(maxvalue) tablespace dw1

 );

  散列分區

   散列分區通過指定分區編號來均勻分布數據的一種分區類型,因為通過在I/O設備上進行散列分區

  ,使行這些分區大小一致。如將part_id的數據根據自身的情況散列地存放在指定的二個表空間中:

create table niegc_part
(
part_id integer primary key,

part_date date,

part_dec varchar2(100)

)

partition by hash(part_id)

(

partition part_01  tablespace dw1,

partition part_02  tablespace dw2

);

關鍵字: 分層查詢 函數 觸發器語法 Oracle物化視圖 跟蹤sql語句
本文詳細介紹從零開始學Oracle—性能對象(六)
  --系統將按part_id將記錄散列地插入二個分區中,這裏也就是二個不同的表空間中。

  復合分區:範圍分區和散列分區的結合

  --語法

   partition by range(列1)
   subpartition by hash(列2)
   subpartition 分區數目 [tore in (表空間1,表空間2)]
   (
      partition  part1 values less than (值1),
     partition  part2 values less than (maxvalue)
    )
--例:對emp表的復合分區,先按薪資分再按部門分
    partition  by range(sal)
   subpartition by hash(empno)
   (
     partition p1 values less than('1501')
       (
          subpartition sp1 tablespace a1,
          subpartition sp2 tablespace a2
       )
     partition p2 values less than('3001')
       (
          subpartition sp3 tablespace a1,
          subpartition sp4 tablespace a2
       )

   )

  --查看表分區

            select * from emp partition(p1)
            select * from emp subpartition(sp1)

  列表分區:允許用戶明確地控制行到分區的映射

--語法
    partition  by list(列名)
   (
       partition part1 values(值1),
       partition part2 values(值2),
       partition part3 values(default)
  --default關鍵字用於存儲前面的分區不能存儲的記錄
  )

關鍵字: 分層查詢 函數 觸發器語法 Oracle物化視圖 跟蹤sql語句
本文詳細介紹從零開始學Oracle—性能對象(六)
   分區的維護操作

  1.添加分區

    alter  table Table add partition 分區名 values less than (值)
   如果邊界是maxvalue 使用split partition語句
    alter table Table split  partition 分區名 at (值)

  2.刪除分區

    alter table Table drop partition 分區名

  3.截斷分區 (只刪除記錄,不刪除結構)

    alter table Table truncate partition 分區名

  4.合並分區  

    alter table Table merge partitions p1,p2 into partition p2

  5.拆分分區

    alter table Table split partition 分區1 at (值) into(partition 分區1,partition 分區2)

  6.移動分區

    alter table Table move partition 分區 tablespace(表空間名)

(七)、Oracle之<PL/SQL>

從零開始學Oracle—PL/SQL(七)
  PL/SQL簡介

   PL/SQL(Procedural Language Sql,過程語言|SQL)是結合了Oracle過程語言和結構化查詢語言(SQL)的一種擴展語言.

   PL/SQL塊是一段後臺服務程序,它負責將數據從數據庫中取出來,在PL/SQL塊中進行處理,將處理的結果送到數據庫.

  優點:

   1,支持SQL

   2,支持面向對象編程(OOP)

   3,更好的性能

   4,可移置性

   5,與SQL集成 --支持所有SQL數據類型和Null值 ,另%type  %rowType屬性類型更加強了這種集成

   6,安全性

  PL/SQL塊包括3個部分:

  1,聲明部分    --變量,遊標,自定義異常, 局部子程序

  2,可執行部分   --執行命令,可嵌套子塊

  3,異常處理部分

 1PL/SQL塊
 2  declare
 3
 4  begin
 5   --SQL語句
 6   --直接寫的SQL語句(DML/TCL)
 7   --間接寫execute immediate <DDL/DCL命令字符串>
 8   --select 語句
 9         <1>必須帶有into子句
10             select empno into eno from emp
11           where empno =7369;
12        <2>只能查到一行**********
13        <3>字段個數必須和變量的個數一致
14  exception  --異常
15    when <異常名字> then --特定異常
16        <處理語句>
17    when others then  --所有異常都可捕獲
18        <處理語句>  
19  end;
20

關鍵字: 分層查詢 函數 觸發器語法 Oracle物化視圖 跟蹤sql語句
本文詳細介紹從零開始學Oracle—PL/SQL(七)
  語言特征:

  <1>,大小寫不敏感

  <2>,復合符號的含義

   :=   賦值操作符   ||連接操作符  ..範圍操作符  **求冪操作符 《,》標簽分隔符    --單行註釋  /*,*/多行註釋

  <3>聲明變量   --變量名  數據類型 :=值  例: varA  varchar2(10):='聲明變量';

  <4>聲明常量   --變量名 constant 數據類型 := 值  

  ---------------- 技巧:初始化變量和常量時,保留字default可替換:=賦值操作符--------------

  <5>屬性類型

   %type   --引用某個變量或數據庫列的數據類型來聲明變量
   %rowType  --提供表示表中一行的記錄類型

  <6>控制結構

   a,條件控制  if  then  或     if  then  else   或    if  then  elsif   或     case
   b,循環控制 loop
                  while              exit或exit when退出
                  for
   c,順序控制  Goto             Null語句

  語法示例:

  1--PL/SQL 簡單語法
  2
  3Begin
  4  null; 
  5End;
  6/
  7
  8Declare
  9  varA number(4);
 10Begin
 11  varA := 1234;
 12  DBMS_output.put_line(varA);
 13End;
 14/
 15
 16Declare
 17  varA number(4);
 18Begin
 19  varA := 1234;
 20  DBMS_output.put_line(varA);
 21  Declare
 22    varB number(4):=2234;
 23  Begin
 24    DBMS_output.put_line(varA);
 25    DBMS_output.put_line(varB);
 26  End;
 27  DBMS_output.put_line(varB);
 28End;
 29/
 30
 31Declare
 32  varA number(4);
 33  varB number(4):=2234;
 34Begin
 35  varA := 1234;
 36  DBMS_output.put_line(varA||'  '||varB);
 37End;
 38/
 39Begin塊 註意事項:
 40-- 數據定義語言不能直接執行
 41Begin
 42  drop table depta;
 43End;
 44/
 45
 46-- select不能直接執行
 47select  --必須使用select into 形式,只能且必須返回一行
 48Declare
 49  varE empa%rowType;  --與表的一行類型一樣
 50  vno empa.empno%type;  -- 與表的某列類型一樣
 51Begin
 52  vno := 7902;
 53  select * into varE from empa where empno = vno;
 54  DBMS_output.put_line( varE.ename||'  '||varE.job);
 55End;
 56/
 57
 58inset  --可以直接執行
 59Declare
 60  vno empa.empno%type;
 61  vna empa.ename%type;
 62  vjob empa.job%type;
 63Begin
 64  vno := 1236;
 65  vna := 'Wing';
 66  vjob := 'MANAGER';
 67  insert into empa (empno,ename,job) values(vno,vna,vjob);
 68End;
 69/
 70
 71delete --可以直接執行
 72Declare
 73  vno empa.empno%type;
 74Begin
 75  vno := 5555;
 76  delete from empa where empno = vno;
 77End;
 78/
 79
 80
 81update --可以直接執行
 82Declare
 83  vno empa.empno%type;
 84  rsal empa.sal%type;
 85Begin
 86  vno := 1236;
 87  rsal := 100;
 88  update empa set sal = nvl(sal,0) + rsal where empno = vno;
 89End;
 90/
 91
 92 --事物控制語言可以直接執行
 93Declare
 94  vno empa.empno%type;
 95  rsal empa.sal%type;
 96Begin
 97  vno := 1236;
 98  rsal := 100;
 99  update empa set sal = nvl(sal,0) + rsal where empno = vno;
100  commit;
101End;
102/
103
104 -- 數據安全語言(DCL)不能直接執行
105Begin
106  grant connect to scott;
107End;
108/

關鍵字: 分層查詢 函數 觸發器語法 Oracle物化視圖 跟蹤sql語句
本文詳細介紹從零開始學Oracle—PL/SQL(七)
   例子:

題:編寫程序 向DEPT表中插入一條記錄,
    從鍵盤輸入數據,如果
    數據類型輸入錯誤要有提示
    無法插入記錄 也要有提示
    只能輸入正數,如果有負數提示
   declare
    n number;
    no dept.deptno%type;
    nm dept.dname%type;
    lc dept.loc%type;
    exp exception;   --用戶定義的變量
    exp1 exception;   --用戶定義的變量
    num number:=0;   --計數器
     pragma exception_init(exp,-1); --預定義語句
    --捆綁Oracle內置異常(-1錯誤和異常變量關聯),-1 主鍵沖突
    pragma exception_init(exp1,-1476);除零異常
    e1 exception; --用戶定義的變量
   begin
    --輸入值
      no := '&編號';
     num := num + 1;
     if no < 0 then
        raise e1;    --自定義異常的引發
      end if;

     nm := '&名稱';
     num := num +1;

     lc := '&地址'; 
     num := num +1;

     n := 10 /0;    

     insert into dept values (no,nm,lc);
     num := num +1;
     commit;

   exception
     --自定義異常
     when e1 then
        dbms_output.put_line('編號不能為負數');
     --數據類型不對
     when value_error then
        if num =0 then 
         dbms_output.put_line('編號數據類型不對');
        elsif num = 1 then
         dbms_output.put_line('名稱數據類型不對');
        elsif num =2 then
         dbms_output.put_line('地址數據類型不對');
        end if;
        rollback;
     --主鍵沖突
     when exp then
         --sqlcode全局變量 異常錯誤號
         --sqlerrm全局變量 異常的文字信息 
         --dbms_output.put_line('異常的編號:'||sqlcode);
         --dbms_output.put_line('異常的內容:'||sqlerrm);
         --dbms_output.put_line('編號已存在') ;
         rollback;
     --非預定義異常(關聯錯誤號)
     when exp1 then
        dbms_output.put_line('0做了除數') ;
         raise_application_error(-20001,'0做了除數');
         --引起一個自定義的錯誤
           --預先保留-20001 到 -29999編號
         rollback;
     --其他的異常
     when others then
         dbms_output.put_line('異常的編號:'||sqlcode);
         dbms_output.put_line('異常的內容:'||sqlerrm);
        -- dbms_output.put_line('出現錯誤');
         rollback;
   end; 

(八)、Oracle之<異常處理>

從零開始學Oracle—異常處理(八)
  一、異常

   (1) 程序錯誤

   - 編譯時

   - 運行時

   (2)異常

   - 處理運行時錯誤

  .PL/SQL是如何處理異常的?

   -  錯誤引發異常

   -  每當引發異常時,都將控制權傳遞給異常處理程序

   -  異常處理程序處理異常

  .異常中涉及的步驟

   -  聲明異常

   -  引發異常

   -  處理異常

  .異常的類型

   -  預定義的異常   --由Oracle服務器維護異常

   -  非預定義的異常 又稱'用戶定義異常'

  1、預定義異常

   由Oracle為常見錯誤預定義

   在DBMS_Standard程序包中提供了這些定義

   不需要顯式聲明

declare
   empJob emp.job%type;
begin
  select job into empjob from emp where empno=0000;
  DBMS_output.put_line('Employee job is '||emjob);
Exception
  when No_data_found then
     DBMS_output.put_line('錯誤了,查詢沒有返回行');
  when too_many_rows then
     DBMS_output.put_line('錯誤了,查詢返回了多條數據');
  when zero_divide  then
     DBMS_output.put_line('錯誤了,除數不能為零');
  when others then  --一定是最後一個處理的代碼
      DBMS_output.put_line('錯誤了,未知的錯誤信息');
end;

  2、非預定義異常

   無法預知的錯誤,如網絡不通、服務沒有啟動、或其他錯誤,這樣的異常需要用戶要定義

declare
   PK_conflict Exception;  --用戶定義異常
   iCount int:=0;
begin
   select count(*) into iCount from emp where empno='7369'
   if iCount>0 then
       raise   Dup_Value;  --引發異常
   end if;
Exception
    when PK_conflict  then   --處理異常
      DBMS_output.put_line('表中已經有這條記錄了');
end;
/

關鍵字: 分層查詢 函數 觸發器語法 Oracle物化視圖 跟蹤sql語句
本文詳細介紹從零開始學Oracle—異常處理(八)
  以上代碼的問題是,只有條件滿足 才會引發異常,否則永遠都不會執行此句.

  並且當有多個語句都有可能會引發此異常時,代碼就過於冗余.並且都要顯示

  的引發異常,能不能讓系統幫我們維護自定義異常了,當有異常引發時 自動

  通知Oracle服務器處理異常

  pragma指令

declare
   PK_conflict Exception;  --用戶定義異常
   pragma  Exception_init(PK_conflict -1);  --編譯指令 可以把異常捆綁到Oracle 並覆蓋預定義的異常
   iCount int:=0;                                     這裏的-1 代表主鍵沖突
begin
   insert into emp(empno,ename) values('7369','FeiYang');
Exception
    when PK_conflict then   --處理異常
      DBMS_output.put_line('表中已經有這條記錄了,主鍵沖突');
end;

  為了給用戶友好的錯誤提示.用此函數可以定義友好的提示。

DBMS_output.put_line()函數只有sqlPlus 客戶端支持.
Raise_Application_Error
  .用於創建用戶定義的錯誤消息的過程
  .可以再執行部分和異常部分使用
  .必須介於 -20000 和 -20999之間
  .可以存儲2M的錯誤信息
declare
   PK_conflict Exception;  --用戶定義異常
   pragma  Exception_init(PK_conflict -1);  --編譯指令
   iCount int:=0;
begin
   insert into emp(empno,ename) values('7369','FeiYang');
Exception
    when PK_conflict then   --處理異常
      Raise_Application_Error(-20001,'表中已經有這條記錄了'); --註意參數的前後順序
end;

關鍵字: 分層查詢 函數 觸發器語法 Oracle物化視圖 跟蹤sql語句
本文詳細介紹從零開始學Oracle—異常處理(八)
  常見系統異常參考表:

 1命名的系統異常                  產生原因
 2 access_into_null           未定義對象
 3 CASE_NOT_FOUND             CASE 中若未包含相應的 WHEN ,並且沒有設置 ELSE 時
 4 COLLECTION_IS_NULL         集合元素未初始化
 5 CURSER_ALREADY_OPEN        遊標已經打開
 6 DUP_VAL_ON_INDEX           唯一索引對應的列上有重復的值
 7 INVALID_CURSOR             在不合法的遊標上進行操作
 8 INVALID_NUMBER             內嵌的 SQL 語句不能將字符轉換為數字
 9 NO_DATA_FOUND              使用 select into 未返回行,或應用索引表未初始化的元素時
10 TOO_MANY_ROWS              執行 select into 時,結果集超過一行
11 ZERO_DIVIDE                除數為 0
12 SUBSCRIPT_BEYOND_COUNT     元素下標超過嵌套表或 VARRAY 的最大值
13 SUBSCRIPT_OUTSIDE_LIMIT    使用嵌套表或 VARRAY 時,將下標指定為負數
14 VALUE_ERROR                賦值時,變量長度不足以容納實際數據
15 LOGIN_DENIED               應用程序連接到 oracle 數據庫時,提供了不正確的用戶名或密碼
16 NOT_LOGGED_ON              PL/SQL 應用程序在沒有連接 oralce 數據庫的情況下訪問數據
17 PROGRAM_ERROR              PL/SQL 內部問題,可能需要重裝數據字典& pl./SQL 系統包
18 ROWTYPE_MISMATCH           宿主遊標變量與 PL/SQL 遊標變量的返回類型不兼容
19 SELF_IS_NULL               使用對象類型時,在 null 對象上調用對象方法
20 STORAGE_ERROR              運行 PL/SQL 時,超出內存空間
21 SYS_INVALID_ID             無效的 ROWID 字符串
22 TIMEOUT_ON_RESOURCE        Oracle 在等待資源時超時
(九)、Oracle之<小經驗>

學習 Oracle 數據庫的幾點經驗:

  1. 在Dos命令下輸入 sqlplus 可以打開 Oracle 自帶的 SQL Plus 並出現登錄提示,而輸入 sqlplus/nolog 則打開 SQL Plus 後不出現登陸提示;

  2. 在 SQL Plus 中輸入 conn 可以連接數據庫,其中的一種格式為:

  SQL> conn 用戶名/密碼 如: conn scott/tiger

  3. Oracle 中給用戶加鎖與解鎖的代碼:

  SQL> alter user 用戶名 account lock; (加鎖)

  SQL> alter user 用戶名 account unlock; (解鎖)


Tags: Oracle 從零開始

文章來源:


ads
ads

相關文章
ads

相關文章

ad