1. 程式人生 > >sqlplus常用命令使用

sqlplus常用命令使用

show和set命令是兩條用於維護SQL*Plus系統變數的命令

     SQL> show all --檢視所有68個系統變數值

     SQL> show user --顯示當前連線使用者

     SQL> show error                --顯示錯誤

     SQL> set heading off --禁止輸出列標題,預設值為ON

     SQL> set feedback off --禁止顯示最後一行的計數反饋資訊,預設值為"對6個或更多的記錄,回送ON"

     SQL> set timing on --預設為OFF,設定查詢耗時,可用來估計SQL語句的執行時間,測試

效能

     SQL> set sqlprompt "SQL> " --設定預設提示符,預設值就是"SQL> "

     SQL> set linesize 1000 --設定螢幕顯示行寬,預設100

     SQL> set autocommit ON --設定是否自動提交,預設為OFF

     SQL> set pause on --預設為OFF,設定暫停,會使螢幕顯示停止,等待按下ENTER鍵,再顯示下一頁

     SQL> set arraysize 1 --預設為15

     SQL> set long 1000 --預設為80

     說明:
     long值預設為80,設定1000是為了顯示更多的內容,因為很多資料字典檢視中用到了long資料型別,如:

SQL> desc user_views
列名                          可空值否   型別
------------------------------- -------- ----
VIEW_NAME                       NOT NULL VARCHAR2(30)
TEXT_LENGTH                              NUMBER
TEXT                                     LONG



命令列表:
假設當前執行命令為:select * from tab;

(a)ppend     新增文字到緩衝區當前行尾    a  order by tname 結果:select * from tab order by tname;
                                      (注:a後面跟2個空格)
(c)hange/old/new 在當前行用新的文字替換舊的文字 c/*/tname     結果:select tname from tab;
(c)hange/text  從當前行刪除文字        c/tab       結果:select tname from ;
del       刪除當前行
del n      刪除第n行
(i)nput 文字   在當前行之後新增一行
(l)ist      顯示緩衝區中所有行
(l)ist n     顯示緩衝區中第 n 行
(l)ist m n    顯示緩衝區中 m 到 n 行
run       執行當前緩衝區的命令
/        執行當前緩衝區的命令
r        執行當前緩衝區的命令
@檔名     執行調入記憶體的sql檔案,如:

SQL> edit s<回車>
如果當前目錄下不存在s.sql檔案,則系統自動生成s.sql檔案,
在其中輸入“select * from tab;”,存檔退出。

SQL> @s<回車>
系統會自動查詢當前使用者下的所有表、檢視、同義詞。

@@檔名     在.sql檔案中呼叫令一個.sql檔案時使用

save 檔名   將緩衝區的命令以檔案方式存檔,預設副檔名為.sql
get 檔名    調入存檔的sql檔案
start 檔名   執行調入記憶體的sql檔案

spool 檔名   把這之後的各種操作及執行結果“假離線”即存檔到磁碟檔案上,預設副檔名為.lst
spool      顯示當前的“假離線”狀態
spool off    停止輸出

例:
SQL> spool a
SQL> spool
正假離線到 A.LST
SQL> spool off
SQL> spool
當前無假離線


exit       退出SQL*PLUS
desc 表名    顯示錶的結構
show user    顯示當前連線使用者
show error    顯示錯誤
show all     顯示所有68個系統變數值
edit       開啟預設編輯器,Windows系統中預設是notepad.exe,把緩衝區中最後一條SQL語句調入afiedt.buf檔案中進行編輯
edit 檔名   把當前目錄中指定的.sql檔案調入編輯器進行編輯

clear screen   清空當前螢幕顯示

 -22-----------------------------------------------------------------------------------------------

第三章附:上機練習

內容:1.建立一資料庫,啟動例項並裝配它。
   2.通過訪問資料字典瞭解資料庫的結構及例項結構。

步驟:
  一.建立資料庫
用Netterm或Ptelnet,以Oracle8帳號登入uibm主機(IP:210.34.0.23)。

進入 /oracle/目錄,ls檢視其結構。
           -------- clt1  ---- oradata  -- ora
           |              |--- testdata -- test
           |
      |------- ctl2  ----- oradata  -- ora
      |              |---  testdata -- test
      |
      |------- ctl3    …  … 
以上目錄為各資料庫中資料檔案存放目錄。
效仿以上的目錄結構,在ctl1、ctl2、clt3目錄下再建一個tstdata目錄,並在各tstdata
目錄下建立一個tst目錄

cd /oracle/app/oracle/admin
此目錄為Oracle各資料庫的管理目錄。
cd test
進入test目錄瞭解Oracle目錄組織結構(OFA結構),結合ls命令。
       ora  ------- bdump  後臺儲存檔案目錄(BACKGROUP_DUMP_DEST的值)
       |------ udump  使用者轉儲檔案目錄(USER_DUMP_DEST的值)
       |------ cdump  核心檔案
       |------ pfile  init.ora和任何其它資料庫初始化引數
       |------ create 用於建立初始化資料和資料庫物件的指令碼
       |------ SQL    資料庫管理SQL檔案
      
進入create目錄閱讀crdbtest.sql及crdb2test.sql這兩個資料庫ORA的建立指令碼,進而知
道建立資料庫的過程命令。

 效防test下的目錄結構,建立一名為tst的目錄,拷貝test/pfile及test/create下的所有
檔案到對應目錄。
          Cd /oracle/app/oracle/admin
          Mkdir tst
          Cd tst
          Mkdir bdump
          Mkdir udump
          Mkdir cdump
          Mkdir pfile
          Mkdir create
          Mkdir sql
          Cp ../test/pfile/* pfile
          Cp ../test/create/* create
          進入tst/pfile目錄,啟動vi編輯器編輯configora.ora檔案:
       將所有與原來test目錄有關的目錄全以tst替換test.
         如:原來的control_files引數中
                把/oracle/ctl1/oradata/test/control01.ctl,改為
                  /oracle/ctl1/oradata/tst/control01.ctl,
            需要改的地方還有:core_dump_dest
                              user_dump_dest 
                              db_name 引數行
                  
        把檔案configtest.ora改名為configtst.ora
              inittest.ora   改名為inittst.ora
              inittest_0.ora 改名為inittst_0.ora
        編輯inittst.ora及inittst_0.ora檔案,把它們中的前面的ifile指
      定檔案原來為:
         ifile = /oracle/app/oracle/admin/test/pfile/configtest.ora   
       改為:
         ifile  = /oracle/app/oracle/admin/tst/pfile/configtst.ora   


進入tst/create目錄
把crdbtest.sql及crdb2test.sql改名為crdbtst.sql及crdb2tst.sql

編輯crdbtst.sql檔案,修改以下行(將test改為tst):
  spool /oracle/app/oracle/admin/test/create/crdbtest.lst
         startup nomount pfile= …
         create database "test" 改為create database “tst”
       將create database語句的用的character set改為ZHS16CGB231280,
       原先為US7ASCII。ZHS16CGB231280為Oracle中支援中文國標的字符集名。
      
        編輯crdb2tst.sql檔案,將其做類似以上的修改(將建立命令中所用到的有關原來
test目錄改為tst目錄,並可以適當調節你所要建立資料庫的相關資料檔案大小。

修改ORACLE_SID環境變數值為新的SID名,此SID告訴oracle欲啟動的例項名。
     ORACLE_SID=tst;exprot ORACLE_SID

  進入tst/create目錄,啟動伺服器管理器(svrmgrl)執行crdbtst.sql指令碼:
cd /oracle/app/oracle/admin/tst/create
     svrmgrl  @crdbtst.sql
    執行後在svrmgrl狀態下再執行crdb2tst.sql指令碼。
    Svrmgrl> start crdb2tst.sql
    建立過程需要數分鐘,請耐心等待 … 

        等上以指令碼執行完畢,新的資料庫已建立。此時,可以退出svrmgrl。

        拷貝tst/pfile/inittst.ora檔案至$ORACLE_HOME/dbs目錄,省得每次啟動svrmg
rl還要指定init.ora檔案位置。在啟動svrmgrl時,若沒有特別指定init.ora的檔案,ORA
CLE將在$ORACLE_HOME/dbs找init<SID>.ora作為其啟動的初始化引數檔案,SID為ORACLE_S
ID環境變數值。

再次啟動svrmgrl(注意:ORACLE_SID值必須已改為新的SID值。)
  svrmgrl
svrmgrl>connect internal;
svrmgrl>startup            (啟動資料庫)
svrmgrl>start $ORACLE_HOME/dbs/catproc.sql 
  
catproc.sql指令碼安裝Procedural Option所必需的指令碼或PL/SQL物件及其支援的資料庫結
構。

至此,我們已成功建立了一個新的資料庫tst,並且我們也用例項tst來裝配啟動它。
為了能夠讓使用者從遠端訪問此資料庫,我們還必須配置Oracle的TNS(Transparent Netwo
rk Service),配置這一服務只要改變一下其配置檔案listener.ora即可,最簡單的辦法
是拷貝一個副本備份,然後直接編輯它,把原來的例項名更換為新的例項名即可。更名後
,重新啟動tnslistener程序即生效。
$lsnrctl stop     (在作業系統狀態下執行)
$lsnrctl start


更改SYS及SYSTEM使用者的默讓密碼。
  grant connect to sys(或system) identified by <new_password>
 或 alter user sys identified by <new_password> 
    以上命令可以在伺服器管理器狀態下執行,也可以在Sqlplus下執行。
 


二、考察資料庫及例項結構
 啟動sqlplus用SYS或SYSTEM使用者連線。
或啟動svrmgrl,connect internal

1. 查詢例項啟動時間。
     select to_char(a.value,’J’)+b.value/86400,
            ’HH24:MI:SS DD-MON-RR’) start_time 
            from v$instance a,v$instance b
            where a.key=’STARTUP TIME –JULIAN’ AND
                   b.key=’STARTUP TIME –SECONDS’;
         
觀看例項儲存器分配資訊
SELECT name,bytes from v$sgastat
      Where name in (‘free memory’,’fixed_sga’,’db_block_buffers’,
                     ‘log_buffer’,’dictionary cache’,’library cache’,
                     ‘sql area’);

檢視程序例項程序
select spid,name from v$process, v$bgprocess where addr =paddr; 

檢視資料庫使用者
select username from dba_users;

檢視活動的控制檔案
select * from v$controlfile

查看回滾段資訊
select a.segment_name,b.bytes,b.extents,a.tablespace_name, 
       c.shrinks,c.extends,c.hwmsize
  from dba_rollback_segs a,dba_segments b,v$rollstat c
  where a.segment_id=c.usn and a.segment_name=b.segment_name;
       
檢視重做日誌資訊
select   member,bytes,members,a.status 
   from  v$log, V$logfile b
   where a.group# = b.group#
   order by member;

檢視資料庫連結
select spid,mame from v$sysstatprocess,v$sysstatbgprocess
     where paddr(+)=addr;

檢視多執行緒伺服器程序
   select * from v$dispatcher;
   select * from v$shared_server;





第四章:SQL
                  (本次課在機房,結合上機講授)
本章介紹SQL的基礎知識。理解了SQL就理解了關係資料庫。Oracle與資料庫的所有互動都
使用SQL(Structured Query Language)。SQL*Plus是基於SQL但又具有Oracle特定功能的一
種工具,它可用來生成報表、控制螢幕顯示和列印輸出格式。

術語
下面介紹本章使用的一引技術術語:
■ DDL(Data Definition Language)   資料定義語言是SQL中定義資料庫中資料的結構的
語言。定義資料時,將在Oracle的資料字典中生成資料項。常見的DDL關鍵字是create、r
evoke、grant和alter
DML(Data Manipulation Language) 資料操縱語言為SQL結構,用來操縱資料庫中資料(而
非定義資料,定義資料由DDL完成)。常見的DML關鍵字為select、insert、update和dele
te。
在Oracle中,我們使用commit(提交)語句表示已經將修改後的資料儲存到資料庫。每次用
戶儲存結果時,Oracle將引用使用者的提交操作。
約束(constraint) 是一種保證一個Oracle表的資料間關係或兩不同表中資料間的一致性的
機制。
Oracle8資料庫中一個物件(object)是一個有意義的事物,可在其內部存放資訊。我們常談
的物件型別——表和檢視是兩種最常見的。
利用如SQL*Plus這樣的程式將資訊從Oracle資料庫中提取出來的操作稱為查詢(query)。

■ 回滾(Rollback)為當某個對話更改了資料庫中的資料後,由於某種原因不想提交些更
改時Oracle所採取的操作。這是一個把資訊恢復到使用者update前狀態的操作。

   SQL語句有兩大類:DDL和DML。下面我們進一步來看看二者的差異:

  二.DDL
DDL資料定義語言是一組SQL命令,用於建立和定義資料庫物件,並且將其儲存在資料字典
中。

資料定義語言使使用者能完成下列任務:
建立(create)資料庫物件
刪除(drop)資料庫物件
更改(alter)資料庫物件
為資料庫物件授權(grant)
回收已授給資料庫物件的許可權(revoke)

當釋出一條DDL SQL語句時,在每一條DDL語句執行前後,Oracle都將提交當前的事務,理
解這一上點很重要。因此如果使用者插入(insert)記錄到資料庫中並且釋出了一條DDL語句
,如create table,此時來自insert命令的資料將提交到資料庫。
 
屬於DDL的語句是自動提交的,這意味著當Oracle8通知使用者比如“Revoke succeeded”,
此時命令已完成不能回滾了。

  DDL語句部分列表:
  alter procedure           重編譯存貯過程
  alter table               增加表列、修改表列、更改存貯分配
  analyze                 收集資料庫物件的效能統計值並送入代價的優化器
  alter table add constraint   在已有的表上增加約束
  create table              建立表
  create index              建立索引
  drop index               刪除索引
  drop table               刪除表
  grant                   將許可權或角色授予使用者或其它角色
  truncate                 刪除表中所有行
  revoke                  從使用者或資料庫角色回收許可權
  三.DML
DML(資料操縱語言)允許使用者對資料庫中的資料進行insert、update、delete和select等操
作。正如名字所示,DML處理資料庫中的資料內容。最常見的DML語句是insert、update、
delete和select。

Insert
Delete
Update
Select
Commit work          把當前事務所作的更改永久化(寫入磁碟)
Rollback              作廢上次提交以來的所有更改
    
     在學習了兩種主要型別的SQL語句後,下面作進一步的介紹。首先登入進SQL*Plus,
然後試一些最常見的DDL和DML語句。
    
 
  四.SQL*Plus入門
學習SQL最簡單的辦法就是使用SQL*Plus。因此先登入到SQL*Plus。Oracle安裝後有一使用者
名scott,口令為tiger。我們可以用這個帳號登入試用。
有兩種方式進入SQL*Plus:
1.使用客戶端的的SQL* Plus 8.0。
  此程式項在啟動選單欄的Oracle For Windows95組中。啟動它,在connect對話方塊中按提
示輸入使用者名稱、口令及主機字串。如果單機已裝了Personal Oracle的,主機字串可以
不填,否則填上SQL * Net已配置的service name,所連線的資料庫例項在service裡已定
義,這些定義可以使用Oracle Net8 Easy Config進行配置。
其結果儲存在/ORAWIN95/NET80/ADMIN/TNSNAMES.ORA檔案中。
   
使用Unix上的SQL*Plus
登入到UNIX主機上,
打入命令 sqlplus scott/tiger   或sqlplus然後再按提示輸入使用者名稱及口令

SQL*Plus: Release 8.0.4.0.0 - Production on Sat Jul 3 0:31:55 1999

(c) Copyright 1997 Oracle Corporation.  All rights reserved.

Connected to:
Oracle8 Enterprise Edition Release 8.0.4.0.0 - Production
    PL/SQL Release 8.0.4.0.0 - Production
     SQL>
  
  在進入SQL*Plus後,會看到SQL*Plus提示符SQL>
這時您就可以鍵入想試驗的SQL語句。

  下面我們講一下與SQL緩衝器一起使用的SQL*Plus命令,這些可以幫助我們高效地輸入命
令。
命令   縮寫 動作
APPEND text A text 在行尾增加text
CHANGE  old/new C old/new 在一行中將old文字改為new文字
CLEAR BUFFER CL BUFF  刪除所有行
DEL 刪除緩衝器中所有行
INPUT I  將一行或多行增加到緩衝器
INPUT text I text 增加一由text組成的行
LIST L 列出SQL*Plus緩衝器內容
LIST n Ln或n 列出行n
LIST * L * 列出當前行
LIST m n  L m n 列出行m至行n
LIST LAST  L LAST 列出緩衝器中的最後一行
RUN 執行緩衝器中的命令
 SQL*Plus中的命令列以分號(;)結束。

 下面我們給出一些SQL語句,大家可以在自己的機器上試驗一下:
select table_name from user_tables
  此命令用資料字典user_tables中列出用登入使用者所擁有的表。
若用scott登入,列出的結果如下:
TABLE_NAME
------------------------------
BONUS
DEPT
DUMMY
EMP
HELP
   SALGRADE

   這些表是在資料庫安裝時建立的讓使用者試驗學習的表,檢視這些表的結構可以用descr
ibe命令,例如:
   SQL>describe emp             
   檢視emp表的結構,結果如下:
 Name                            Null?    Type
 ------------------------------- -------- ----
 EMPNO                           NOT NULL NUMBER(4)
 ENAME                                    VARCHAR2(10)
 JOB                                      VARCHAR2(9)
 MGR                                      NUMBER(4)
 HIREDATE                                 DATE
 SAL                                      NUMBER(7,2)
 COMM                                     NUMBER(7,2)
    DEPTNO                                   NUMBER(2)
   SQL>select empno,ename from emp
   查看錶內容。

  2.create語句
   在任何資料庫總是以DDL語句開始,因為建立資料庫物件的工作是由DDL語句來完成的。
首先,我們將建立四個表:Customer、State、X和Y:
SQL>create table customer (
last_name  varchar2 (30) not null,
state_cd   varchar(2),
sales      number)
tablespace  users
storage (initial 25k next 25k minextents 1);
Table created.
SQL>create table state (
   2  state_cd     varchar(2) not null,
   3  state_name   varchar2(30);
Table created.
SQL>create table x(
   2  col      varchar2(30);
Table created.
SQL>create table y(
col varchar2(30));
Table created.

▲Null與Not Null
    在建立customer表時,last_name表列後跟一個限定符“not null”,這表示資料庫不
接受沒有表列資料行到customer表中。換句話說,not null表列是強制性欄位,在表cust
omer和state中,這意味著要在表中插入一行,last_name和state_cd欄位必須含有值。


什麼是空值(null value)
空(null)是不包括資料的表列。可以將null理解為長度為0的字串。很多時候若不知道某
表列的型別可以給它賦一空值。但人們最容易犯的一個錯誤就是將空值載入到一個數值型
表列中,而問題在於“1+null=null”!因此,如果使用者偶然將空值載入至數值域中,那麼
產生的統計報表肯定不正確。

3.Insert
   現在我們已經建立了一些表,讓我們用不用DML語句,在我們建立的表上插入一些資料
,這些資料也將作為我們試驗命令的資料。
SQL>insert into customer values (‘Teplow’,’MA’,23445.67);
SQL>insert into customer values (‘Abbev’,’CA’,6969.96);

每次成功地完成一條insert語句後,均返回建立資訊,
1 row created.
該資訊通知使用者建立的行數。

SQL>insert into customer values (‘Porter’,’CA’,6989.99);
SQL>insert into customer values (‘Martin’,’CA’,2345.45);
SQL>insert into customer values (‘Laursen’,’CA’,34.34);
SQL>insert into customer values (‘Bambi’,’CA’,1234.55);
SQL>insert into customer values (‘McGraw’,’NJ’,123.45);

現在我們用稍加變化的insert命令的資料插入state表。我們將指定資料要插入的表列名。
這在處理大表時很有用,因為使用者可能沒有表中每一列的資料。例如:在一個預算系統中
,只有在月末才有實際的花銷數。

SQL>insert into state (state_name,state_cd)
values (‘Massachusetts’,’MA’);
SQL>insert into state (state_name,state_cd)
values (‘California’,’CA’);
  
  最後我們再插入一些資料到表X和表Y中。
SQL>insert into x values (‘1’);
SQL>insert into x values (‘2’);
SQL>insert into x values (‘3’);
SQL>insert into y values (‘3’);
SQL>insert into y values (‘4’);
SQL>insert into y values (‘5’);

4.Select 
select命令用於從Oracle資料庫中檢索資料,select是使用者最常用的SQL語句,select
命令由四個基本部分構成:
1).select後跟使用者要檢索的資訊(表或檢視中的列名),這是select命令不可少的部分,
可用*號代表全部列。
2).from後跟檢索物件(如存放資料的一個或多個表或檢視的名稱),from部分也是必不可少
的。
3).where後跟檢索條件,可選的。
4).order by後跟分類準則,可選的。

現在我們來檢視我們剛才插入的資料:
SQL>select * from customer;
SQL>select state_name from state;
SQL>select * from x;
SQL>select * from y;

   下面我們來看一下條件及範圍檢索:
select last_name,state_cd,sales from customer where state_cd=’MA’;
檢視state_cd值為MA的所有客戶。

select * from customer where state_cd=’CA’ and sales>6000
  select * from customer where state_cd=’CA’ or sales>6000
  select * from customer where state_cd!=’MA’;

帶檢索表
select * from customer where state_cd in (‘NJ’,’CA’);

帶匹配條件
Select * from customer where last_name like ‘M%’;
Select * from customer where last_name like ‘%tin%;

  總結:
     =
 !=   不等於
 ^=   不等於
^=   不等於
<>   不等於
     <
     >
     <=
     >=
in  (    )                等於括號內任一成員
not in  (   )             不等於括號內任一成員
between A and B           大於等於A與小於等於B
not between A and B       不大於等於A與小於等於B
like ‘%tin%’               包括給定子串(即‘tin’)


Order by:
   Select * from customer order by last_name desc;
   Select * from customer order by last_name;
   在order by子句中未指定升序或降序時,Oracle按升序排序。

5.Update、Delete和Alter

Update修改表中的資料
  SQL>Update customer set sales=23890.66 where state_cd=’MA’;

  若沒有用where指定修改的條件行,將修改表中全部行。

Delete刪除行資料
  Delete from customer,將刪除customer表的所有記錄;delete from customer where
 state_cd=’CA’,將刪除state_cd為CA的客戶記錄。

Alter table修改表結構
  此語句有如Foxpro中的Modify stru語句。在建立表後,使用者可能想要增加表列。這時就
要用到alter table命令了。

  Alter table customer add (sale_date date);
  將成功地把表列sale_date加到表customer中。

  Alter table x modify(col date),改變一個已存在表列的資料型別。

6.連線兩個表
現實中,使用者需要的大量資料往往存放在多個表中。很多情況下需要處理多個表。例如,
customer表中只存放州程式碼(state_code),然而使用者還想知道州名,這時需要將表custom
er與表state連線。這就要用到表的連線。通過定義,Oracle一類的關係資料庫允許使用者基
於公共域連線兩個或更多表。這些公共域通常稱為鍵域(key field)。
有兩種型別的鍵:主鍵(primary)和外部鍵(foreign)。主鍵使表中的資料行保持唯一。
在表state中,state_cd就是主鍵。表customer中也包含有state_cd,此時的state_cd就是
外部鍵。一個表的外部鍵用於從其他(foreign)表中獲取資訊。
SQL>select * right.col,left.col from x right,y left 
where right.col=left.col;


五.內部函式
數值型函式
 函  數    返回值    樣  例 顯示
Abs(n) N的絕對值 Select abs(-321) from dual; 321
Ceil(n) 大於等於數值n的最大整數 Select ceil(10.6) from dual; 11
Floor(n) 小於等於數值n的最大整數 Select floor(10.6) from dual; 10
Mod(m,n) M除以n的餘數,若n=0返回n Select mod(7,5) from dual; 2
Power(m,n) M的n次方 Select power(3,2) from dual; 9
Round(n,m) 將n四捨五入,保留小數點後m位 Select round(1234.5678,2) from dual 12
34.57
Sign(n) N=0,返回0;n>0,返回1;n<0,返回-1 Select sign(12) from dual; 1
Sqrt(n) N的平方根 Select sqrt(25) from dual; 5
  Dual表擁有者為SYS,在句法正確,而資料庫中沒有其他表可用於該語句時,可使用dua
l表。
   2.字串函式
 函   數   返回值 樣例 顯示
initcap(char)   把每個字串的第一個字元換成大寫 Select initcap(‘mr.telpow’)
 from dual; Mr.Telplow
Lower(char) 整個字串換成小寫 Select lower(‘Mr.Frank Townson’) from dual; m
r.frank townson
Replace(char,str1,str2) 字串中所有str1換成str2 Select replace(‘Scott’,  ’
S’,’Boy’) from dual; Boycott
Soundex(char) 字串的語音表示,查詢發音相似拼寫不同的字串 Select last_name 
from employee where soundex (last_name) = soundex(‘SMYTHE’); SMITH
Substr(char,m,n) 取出從m字元開始的n個字元的子串 Select substr(‘ABCDEF’,2,1) 
from dual; B
Length(char) 求字串的長度 Select length(‘Anderson’) From dual; 8
 
  ||  並置運算子。
  Select ‘Dear’||’John’||’:’ from customer 
  將返回 ‘DearJohn:’

   3.日期型函式
  函式 返回值 樣例 顯示
Sysdate 當前日期和時間 Select sysdate from dual;
Last_day 本月最後一天 Select last_day(sysdate) From dual
Add_month(d,n) 當前日期d後推n個月 Select add_months(sysdate,2) from dual;
Months_between (f,s) 日期f和s間相差月數 Select months_between(sysdate,’12-MAR
-99’) from dual;
Next_day(d,day) D後第一週指定day的日期 Select next_day(sysdate,’Monday’) fro
m dual;
Oracle預設的日期格式為DD-MON-YY。為保證進入21世紀不出問題,請儘可能用四位數字的
年份。Oracle提供了一種特殊的世紀日期格式標記為DD-MON-RR。

常用日期格式
格式 返回值 樣例
Y、YY或YYY 年的最後一位,兩位或三位 Select to_char(sysdate,’YYY’) from dual;

SYEAR或YEAR 年,SYEAR公元前的年前加一負號 Select to_char(sysdate,’SYEAR’) fr
om dual;
Q 季度,1到3月為第一季度 Select to_char(sysdate,’Q’) from dual;
MM 月份數
Month 用9個字元長度表示月分(英文)
WW 當年第幾周
W 本月第幾周
D 周內第幾天
DD 當月第幾天
DY 周內第幾天縮寫(如:SUN)
HH 12進位制小時數
HH24 24進位制小時數
MI 分鐘數
SS 秒數

型別轉換
   to_char  將任意型別的資料轉換成字串
   to_number
   to_date


六.格式化輸出
在SQL*Plus中,有許多引數可以控制SQL*Plus的輸出顯示格式,利用SQL*Plus命令show a
ll使用者能知道顯示格式的當前設定。
SQL>show all;
appinfo is ON and set to "SQL*Plus"
arraysize 15
autocommit OFF
autoprint OFF
autotrace OFF
shiftinout INVISIBLE
blockterminator "." (hex 2e)
btitle OFF and is the 1st few characters of the next SELECT statement
cmdsep OFF
colsep " "
compatibility version NATIVE
concat "." (hex 2e)
copycommit 0
COPYTYPECHECK is ON
define "&" (hex 26)
echo OFF
editfile "afiedt.buf"
   embedded OFF
    …  ...

1).行和頁的大小
   set linesize <n>
   set pagesize <n>
 例:
  SQL>set linesize 80;
  SQL>set pagesize 25;

2) 頁頭標、頁尾標
   ttitle  <Title string>
   btitle  <Foot title string>

 例:  (connect as scott)
  SQL>ttitle ‘Database Technoloies| Customer Report’;
  SQL>select empno,ename from emp;
  SQL>btitle ‘-----------Sample.sql------------‘;
  SQL>select empno,ename from emp;
 
   |   表示換行。


3).SQL*Plus結果到檔案
  spool  <目標檔案>
  如:spool  c:/temp/out.list
  這個輸出將放在spool命令指定的檔案中。為停止假離線(spooling),可用命令spool o
ff或spool out。後者關閉輸出檔案並列印輸出。

4).格式化輸出列表
column

大多數情況下,使用者需要格式化例項的表列資料。Column命令可完成這項工作。下面我們
先執行兩條格式化命令,然後再查詢customer表。
   SQL>column last_name format a8 wrap heading ‘Last |Name’;
   SQL>column state_cd format a8 heading ‘State | Code’ ;
  
                   8  表示顯示寬度,
                a  表示每個位置只能是字元
                wrap 說明若last_name長度大於8個字元,多餘的字元顯示下一行的對應
位置。
                Heading 部分告訴SQL*plus,last_name的列標。
   現在我們查詢一下customer表來看不下輸出效果:
SQL>select * from customer ;
Sun Jul 04                                                      page    1
                             Database Technologies
                                 Customer Report

Last     State
Name     Code      SALES
-------- -- ----------
Teplow   MA   23445.67
Abbev    CA    6969.96
Porter   CA    6989.99
Martin   CA    2345.45
Laursen  CA      34.34
Bambi    CA    1234.55
McGraw   NJ     123.45

               -------------------sample.sql---------------------



本章小結:
本章簡要地介紹了SQL及其一些常用的命令,及SQL*Plus的應用。有關SQL的更詳細的使用
說明可以參閱本第4章至第8章,課本在從建表到查詢等操作都有較為詳細的介紹,雖然書
中的章節較長,但其內容簡單易懂,由於課時所限無法在此逐一介紹。建議大家可以在自
己的PC上安裝個Personal Oracle 8,按課本的例子,進行學習試驗。


第五章.PL/SQL
     前面我們所使用的SQL語言,它不具備過程能力,但Oracle通過PL/SQL語言對SQL進行
了過程語言功能的擴充套件。PL/SQL是一種比較複雜的的程式設計語言,用於從不同環境中訪
問Oracle資料庫,。
PL/SQL是Procedural Language/SQL(過程性語言的縮寫)。正如其名所表達的,PL/SQL通
過增加了用在其他過程性語言中的結構(construct)來對SQL進行了擴充套件,例如:
變數和型別(包括預定義的和使用者定義的)
控制結構,例如IF-THEN-ELSE語句和迴圈。
過程和函式
物件型別和方法
    過程性結構與Oracle SQL無縫地整合在一起,這樣便產生了一種結構化的強有力的語
言。在使用Oracle的儲存過程、資料庫觸發器、包和函式都要用PL/SQL編寫程式碼。因此,
如果不瞭解PL/SQL就不能深入掌握Oracle。
    PL/SQL具有高度的可移植性,在所有Oracle平臺上都是標準化的。因為其資料型別基
於資料庫伺服器,所以語言完全與機器無關。你無需針對UNIX、Windows、Netware等等去
學習各種PL/SQL。PL/SQL程式可以在任何Oracle Server上編譯和執行而無需進行任何修改



一.PL/SQL基礎    
 下面我們通過例項程式來學習PL/SQL:
首先我們可以執行一下hello.sql這一簡單的程式,此程式輸出”Hello,world!”。
Hello.sql
SET SERVEROUTPUT ON
BEGIN
  DBMS_OUTPUT.enable;
  DBMS_OUTPUT.put_line(‘Hello, world!’);
END;
/
   啟動SQL*plus並以system帳號連線Oracle.
 SQL>start c:/plssql/hello.sql 
   用以上命令執行些程式。
   第1行讓SQL*Plus寫出伺服器返回給它的內容。
   第2行和第5 行提供當前塊的作用範圍。
   第3行開啟輸出機制。
   第4行列印簇“Hello, world!”。
   第6行執行這個無名PL/SQL塊。
伺服器響應如下:
Hello, World!
PL/SQL過程已成功完成.
SQL>
    在PL/SQL中字串用單引號圍起來,PL/SQL對文字大小寫唯一敏感的地方是在字串
是,對一些變數、命令等大小寫不敏感。
資料文字可以任何整數或浮點數值,例如:
整數文字
-12345.0             浮點數文字
1234.567890          浮點文字可以是任意精度
這也是浮點文字,精度為零
1.2345E2             可以使用科學計數
1.2345E-3
     0.123 或 .123         開頭的0是可選擇的

下面我們再來看另一個程式:
Circle.sql
DECLARE
  PI CONSTANT REAL:=3.14159265359;   -- PI常量值
  Circumference REAL;           --周長
  Area REAL;                   --面積
  Radius REAL:=&Radius;        --半徑
BEGIN
  Circumference:=PI*radius*2.0;
  Area:=PI*radius**2;
  DBMS_OUTPUT.put_line(‘Radius=’||To_CHAR(radius)||
                        ’,Circumference=’||To_CHAR(circumference)||
                        ‘,Area=’||To_CHAR(area));
END;
/
SQL> start c:/plsql/circle.sql
在執行這個程式時,SQL*Plus首先提示你給&號指定的聯編變數指定一個值(第5行)螢幕
顯示資訊為:
輸入radius的值: 5
原值   5:  Radius REAL:=&Radius;
新值   5:  Radius REAL:=5;
Radius=5,Circumference=31.4159265359,Area=78.53981633975

PL/SQL 過程已成功完成。

   SQL>

程式註釋
單行註釋
  單行註釋由兩個連字元開始,後面一直到行尾都是註釋(回車符標識著註釋的結束)。

如上邊程式中的:
          PI CONSTANT REAL:=3.14159265359;   -- PI常量值
     如果行註釋超過一行,必須在每一行的開頭上使用雙連字元(--)。

多行註釋
多行註釋由/*開始,由*/結束。這是C語言中使用的註釋風格。如circle.sql中的開頭部分
所示。
多行註釋可以擴充套件到任意多的行上,但它們不能巢狀。

PL/SQL塊結構
PL/SQL塊是基本的程式設計結構,用塊結構進行程式設計適用於自上而下的結構化積木式程式設計和直
觀邏輯組織。
一個無名PL/SQL塊有三部分:說明部分、正文(體)部分和異常部分。其中異常部分為可
選項。
    DECLARE
---- declarations (說明)
 BEGIN
      ----executable code(執行程式碼)
EXCEPTION
    ----  exception handlers(異常處理程式碼)
END;
實際上說明部分也是可選項,但不宣告變數是不能執行實質性的工作。使用者定義的全部變
量、常數、資料型別、指示器、函式和過程均在這一部分中說明。若沒有定義其中任何一
個,你可以略去這一部分。

變數宣告
   PL/SQL提供了SQL沒有的附加資料型別。除一般的Oracle SQL資料型別外,PL/SQL還可
以讓您用用這些資料型別對變數進行說明:

   BOOLEAN   布林型別       可用預定義常量TRUE、FALSE或NULL對一個布林變數賦值。

   BINARY-INTEGER           該型別適用於在-2,147,483,647到2,147,483,643
   (二進位制整數)                 範圍內的帶符號整數
   NATURAL(自然數)           是BINARY-INTEGER的一個子集,這種資料型別是整數集的
一部分,從0到2,147,483,647。
   POSITIVE(正整數)         是BINARY-INTEGER的另一個子集, 這種資料型別是整數
集的一部分,從0到2,147,483,647。
   %TYPE                     這種設計可使您說明一個變數的資料型別與某一指定列的
資料型別相同,其結果產生更易於維護的PL/SQL程式碼。
   %ROWTYPE                用這種資料型別您可以說明一個複合變數,與一特定表中的
一行相同,這種複合變數是由引用表中的列名和資料型別組成的。
   除此之外,PL/SQL還提供兩種複合資料型別:TABLE型別和RECORD型。我們將在以後介
紹。
變數作用域
   變數在僅它所在的塊內塊內是可見的。
<<l_outer>>
DECLARE
  V_AvailableFlag BOOLEAN;
  V_SSN        NUMBER(9);
BEGIN
fds
DECLARE
  V_SSN     CHAR(11);
BEGIN
       --v_SSN(char 11)是可見的,要引用v_SSN(number 9)可用
         -- l_outerV_SSN
END;

END;

變數名風格
變數名的關鍵是它們是描述性的。宣告
 x number;
不會告訴您有關x的用途的任何事情。但是
 v_StudenID  NUMBER(5);
將告訴我們該變數可能要用來儲存學生ID號,儘管在宣告旁邊沒有解釋的註釋。請記住,
PL/SQL識別符號的最大長度是30個字元,所有的字元都可以用來傳遞一些含義的。30個字元
通常足以用來儲存一個描述性的名稱了。
變數名也可以告訴我們該變數的用途。有的人使用下劃線將一個字母程式碼和變數的其他部
分分隔來以指明這一點。例如:
v_VariableName         程式變數
e_ExceptionName       使用者定義異常
t_TypeName            使用者定義型別
p_ParameterName       過程或函式引數
c_ConstantValue         常量




  下面我們再來看一個程式, loop.sql  (參見課本P198)
CREATE TABLE test_table (record_number number(3),current_date date);

DECLARE
  max_records CONSTANT int:=100;
  I   int:=1;
BEGIN
  FOR I in 1..max_records LOOP
    If  (mod(i,10)=0)   then
       INSERT INTO test_table
          (record_number,current_date)
       VALUES
          (I, SYSDATE);
    ELSE
       NULL;
    END IF;
  END LOOP;
  COMMIT;
END;
/

COLUMN current_date FORMAT a20
SELECT  record_number,to_char(sysdate,'HH24:MI SS')  FROM test_table;
    DROP TABLE test_table;

迴圈語句 (P.195)
 FOR-LOOP 與 WHILE-LOOP  
  語法:
 FOR loop variable IN [REVERSE] lower-bound..upper-bound LOOP
   Statement; … statemnet;
 END LOOP;

     WHILE condition LOOP
       Statement; … statement;
     END LOOP;

     Condition是一個有效的PL/SQL條件;
     Statement是一個有效的PL/SQL語句。
 
簡單的LOOP語句
  語法:
LOOP 
   Statement; … statement;
END LOOP;
無條件迴圈,為了跳出迴圈,可在當一個條件被滿足時執行EXIT語句。

  EXIT語句:
EXIT  [lable-name]  WHEN condition;
 
 IF語句
   IF  condition THEN
Statement;  … statement;
[ELSIF  condition  THEN 
  Statement;  … statement;
  …
[ELSIF  condition THEN
  statement; … statement;
[ELSE 
  statement;  … statement;]
END IF;
  注意拼寫:是ELSIF而不是ELSEIF;END IF而不是ENDIF。


使用過程
   過程是執行少量重複工作、嚴格地通過引數列表傳入和傳出值的子例行程式。
   Table.sql 
SET SERVEROUTPUT ON
DECLARE 
  --  常量
  TB CONSTANT VARCHAR2(1):=CHR(9);   -- TAB
  --  變數
  status NUMERIC;
  table_rec  all_tables%ROWTYPE;
  --  例程 
  PROCEDURE get_table(Powner     IN       all_tables.owner%TYPE,
                     Ptable    IN       all_tables.table_name%TYPE,
                      Prec      OUT      all_tables%ROWTYPE,
                      Pstatus    IN   OUT NUMBER) IS
     -- Local cursors
     CURSOR table_cur (Cowner all_tables.owner%TYPE,
                       Ctable all_tables.table_name%TYPE) IS
       SELECT  * 
          FROM all_tables
          WHERE owner=Cowner AND table_name = Ctable;
     -- 區域性變數
     Lowner  all_tables.owner%TYPE;
     Ltable  all_tables.table_name%TYPE;
  BEGIN
    Pstatus:=0;    -- OK
    Lowner:=UPPER(Powner);
    Ltable:=UPPER(Ptable);
    OPEN table_cur(Lowner, Ltable);
    FETCH table_cur INTO Prec;
    IF (table_cur%NOTFOUND) THEN
      RAISE NO_DATA_FOUND;
    END IF;
      CLOSE table_cur;
    EXCEPTION
      WHEN OTHERS THEN
       BEGIN
        Pstatus:=SQLCODE;   -- 捕獲錯誤程式碼
        IF (table_cur%ISOPEN) THEN
          CLOSE table_cur;
        END IF;
        Prec:=NULL;
        DBMS_OUTPUT.put_line('get_table:'||SQLERRM(Pstatus));
        DBMS_OUTPUT.put_line('OWNER='||'<'||Lowner||'>');
        DBMS_OUTPUT.put_line('TABLE ='||'<'||Ltable||'>');
       EXCEPTION
        WHEN OTHERS THEN
          NULL;  --don't care(avoid infinite loop)
       END;
  END get_table;
BEGIN
  DBMS_OUTPUT.enable;
  DBMS_OUTPUT.put_line('TABLE'||TB||'TABLESPACE'||TB||
                       'INITIAL'||TB||'NEXT'||TB||'MAX');
  DBMS_OUTPUT.put_line(RPAD('-',43,'-'));   -- Just an under line
  Get_table('scott','dept',table_rec,status);
  IF (status=0) THEN
    DBMS_OUTPUT.put_line(
         Table_rec.table_name       ||TB||
         Table_rec.tablespace_name  ||TB||
         Table_rec.initial_extent   ||TB||
         Table_rec.next_extent      ||TB||
         Table_rec.max_extents);
  END IF;
  Get_table('scott','garbage',table_rec,status);
  IF (status =0 ) THEN
    DBMS_OUTPUT.put_line(
         Table_rec.table_name       ||TB||
         Table_rec.tablespace_name  ||TB||
         Table_rec.initial_extent   ||TB||
         Table_rec.next_extent      ||TB||
         Table_rec.max_extents);
  END IF;
END;
/

遊標的使用:
    參閱課本P.251
     說明遊標 (declare)
     開啟(open)遊標
     用遊標提取資料行(fetch)
     關閉(close)遊標

定義過程:
 PROCEDURE  procedure-name [(argument1[,argumentN])]  IS
[區域性變數宣告]
BEGIN
  Executable-section
  [exception-section]
END [procedure-name];

引數說明
      IN       引數的值傳遞給過程或函式,但是沒有返回給呼叫它的PL/SQL子程式。在
一個過程或函式內部,您不能給說明為IN的引數賦值,只能引用這種型別引數的值。

      OUT     過程或函式不能使用引數傳遞的值,但給呼叫它的PL/SQL子程式一個返回
值。在一個過程或函式內部,您不能用引用說明為OUT的引數值,只能給這種型別引數賦值


      IN OUT  引數的值傳遞給過程或函式,並且給呼叫它的PL/SQL子程式一個返回值。
如果說明一個引數為IN OUT型別,則在過程或函式內部,既可引用這種型別引數的值又可
給其賦值。


函式說明:
    一個PL/SQL函式說明與過程說明很相——只是函式返回一個預定義的資料型別的值。

說明一個函式的語法如下:
FUNCTION function-name  [(argument1 [,argumentN])
  RETURN  function-datatype IS
    [local-variable-decarations]
  BEGIN
    Executable-section
    [exception-section]
  END [function-name];


二.使用儲存過程或函式
儲存過程或函式是儲存在Oracle資料庫中的PL/SQL程式,可由使用者直接或間接呼叫。使用
儲存過程和函式的主要優越性有以下幾點:
.提高了效率 : 在客戶機應用向資料庫伺服器提出對SQL的需求。隨著戶數的的增加,SQ
L請求也就不斷地增加,使網路很快就成為執行的瓶頸。使用儲存過程可使執行效能得到顯
著的改進,因為對儲存過程的一次呼叫,即用了在伺服器中執行的多個SQL語句,從而減少
了網路的擁護。
.可重用性:  一個PL/SQL程式只需編寫一次,即可用在各種地方——SQL指令碼、資料庫觸發
器和客戶機應用程式。
.可移植性:您可在任何Oracle資料庫中使用儲存過程,而不用考慮平臺問題,所以您不需
要處理象作業系統或編譯版本中出現的相容性問題。只要平臺支援Oracle,不需要做任何
改變就可呼叫儲存過程。當然如果儲存過程包含對檔案和路徑名的引用,您就需要另做一
些改變。
.可維護性:一個儲存過程用於完成一個特寫的任務,如資料庫觸發器、SQL*Plus指令碼、應
用程式或其他儲存過程可能需要呼叫該過程。從所有這些地方均可呼叫一個儲存過程,這
樣可降低軟體維護的成本。

建立儲存過程或函式
CREATE [OR REPLACE]  PROCEDURE  procedure_name
  [(argument1 [,argumentN])] IS
  [local-variable-declarations]
 BEGIN
 Executable-section
 [exception-section]
   END  procedure-name;

   CREATE [OR REPLACE] FUNCTION function-name
  [(argument1 [,argumentN])] IS
  [local-variable-declarations]
 BEGIN
 Executable-section
 [exception-section]
   END  function-name;


檢索儲存過程
建立儲存過程後,您也許想看一看PL/SQL程式的原始碼,不過,用於建立儲存過程的SQL腳
本是不可見的,儘管如此,您還是可以使用查詢Oracle資料字典檢視的方法檢索儲存過程
的原始碼。
其中一個檢視名為:USER_SOURCE
               (另一個DBA_SOURCE)
它提供以下四個列:
  NAME    包括過程、函式、包或包體的名字。
  TYPE     指出原始碼是否屬於過程、函式包還是包體。
  TEXT     包含原始碼的一行。
  LINE      包含在TEXT中原始碼包含的行數。
假設我們已建立了名為DROP_CLASS的儲存過程,如果您想看DROP_CLASS的原始碼,查詢US
ER_SOURCE資料字典檢視,那麼用下面的SQL命令:
   select line,text from user_source
        where name=’DROP_CLASS’ order by line;


獲得過程、函式、包或包體的目錄列表
  我們可以查詢USER_OBJECTS獲得屬於當前所連線的Oracle帳號的儲存過程、函式、包或
包體的目錄列表。如果您想看不管屬於誰的所有物件,可以查詢DBA_OBJECTS。
  Select distinct object_type  from user_objects;

三.使用提供的ORACLE資料庫程式包
Oracle資料庫提供兩組程式包:一組是標準程式包,它向Oracle Server提供基本功能,如
你的基本子型別說明和資料型別轉換例行程式;另一組程式包供DBA和開發人員使用。這些
程式包由它們的名字區分,名字以DBMS_或UTL_打頭,意思是它們與資料庫打交道或提供通
用的實用程式。

表4.1 提供的程式包彙總
程式包名 程式包標頭檔案 描述
DBMS_ALERT Dbmsalrt.sql 資料庫事件的異常處理
DBMS_APPLICATION_INFO Dbmsutil.sql 記錄當前執行的應用程式名(用於效能監控)

DBMS_DDL Dbmsutil.sql 重新編譯儲存的子程式和程式包,分析資料庫物件
DBMS_DESCRIBE Dbmsdesc.sql 描述儲存子程式的引數
DBMS_JOB Dbmsjob.sql 在指定時間或時間間隔內執行使用者定義的工作
DBMS_LOCK Dbmslock.sql 管理資料庫鎖定
DBMS_OUTPUT Dbmsotpt.sql 將文字行寫入緩衝器供以後檢索和顯示
DBMS_PIPE Dbmspipe.sql 在會話之間通個儲存“管道”儲存和傳送資訊
DBMS_REFRESH Dbmssnap.sql 管理可以一起重新整理的快照組
DBMS_SESSION Dbmsutil.sql 有計劃地執行alter session語句
DBMS_SHARED_POOL Dbmspool.sql 觀察和管理內容
DBMS_SNAPSHOT Dbmssnap.sql 重新整理、管理快照和清除快照
DBMS_SPACE Dbmsutil.sql 獲取段空間資訊
DBMS_SQL Dbmssql.sql 執行動態SQL和PL/SQL
DBMS_SYSTEM Dbmsutil.sql 關閉/開啟給定會話的SQL跟蹤
DBMS_TRANCACTION Dbmsutil.sql 管理SQL事務
DBMS_UTILITY Dbmsutil.sql 各種實用程式
UTL_RAW Utlraw.sql 用於RAW資料型別的簇函式
UTL_FILE Utlfile.sql 讀/寫基於ASCII的作業系統檔案
UTL_HTTP Utlhttp.sql 從給定的URL獲取HTML格式的頁面
DBMS_LOB Dbmslob.sql 管理大物件
  

在您可以使用Oracle提供的程式包內的例行程式時,您應該首先檢查它們是否存已經安裝
和是否有效。DBA可以執行下列查詢:
SELECT object_name,object_type,status
  FROM dba_objects
  WHERE owner=’SYS’ AND object_type LIKE ‘PACKAGE%’
  ORDER BY object_name,object_type;

    Oracle提供的程式包存放在¥$ORACLE_HOME/rdbms/admin目錄下,你可以對這些程式
包中的每一個檢查其程式包標頭檔案看一看有什麼例行程式和全域性變數可以使用。
    在以上所述目錄下,我們還可以看到以prvt*.sql 和prvt*.plb形式存在的檔案。前者
是提供的程式包包體,為ASCII格式。後者是程式包包體的二進位制編譯版的程式包包體。這
些代表程式包包體的釋出形式。

第六章:DBA
 本章將介紹怎樣成為資料庫管理員(DBA)。DBA工作的貢獻在於使所有執行在Oracle資料
庫上的系統能夠有效地工作。DBA為每一個使用者提供技術支援,並且應當熟悉Oracle軟體方
面的所有技術出版物。DBA具有以下職責:
Oracle資料庫的日常操作
Oracle軟體的安裝與升級
效能協調
備份與恢復管理策略
個人資料庫管理諮詢
開發者諮詢

  一.啟動與關閉資料庫
在大多數情況下,當啟動資料庫時,使用者只需要簡單地啟動Server Manager,連線到資料
庫,然後輸入“Startup”使系統運轉。現在我們介紹輔助啟動命令選項。當需要時可在S
erver Manager中使用這些選項。

   1.啟動命令選項
1).正常啟動(Startup Normal)
  這是預設的啟動方式(可省略Normal一詞)。在前面的學習中,我們已多次使用這種方
式啟動了資料庫。

SVRMGR> connect internal
Connected.
SVRMGR> startup
ORACLE instance started.
Total System Global Area                         16113888 bytes
Fixed Size                                          45280 bytes
Variable Size                                     7802880 bytes
Database Buffers                                  8192000 bytes
Redo Buffers                                        73728 bytes
Database mounted.
    Database opened.

2).安裝啟動(Startup Mount)
   這種方式用於改變資料庫的歸檔或執行恢復狀態。此時資料未開啟,所以不允許使用者訪
問資料。啟動伺服器管理器後,按下述步驟操作:
   SVRMGR>connect internal;
   SVRMGR>Startup Mount;



3).非安裝啟動(Startup Nomount)
   這種方式用於重建控制檔案或重建資料庫。由於資料庫沒有開啟,因此不允許使用者訪問
。啟動伺服器管理器後,按下述步驟操作:
   SVRMGR>connect internal;
   SVRMGR>Startup Nomount;
   ORACLE instance started.
   Total System Global Area                         16113888 bytes
   Fixed Size                                          45280 bytes
   Variable Size                                     7802880 bytes
   Database Buffers                                  8192000 bytes
   Redo Buffers                                        73728 bytes
       Database mounted.

4).約束啟動(Startup Restrict)
使用這種方式能夠啟動資料庫,但只允許具有一定特權的使用者訪問。該命令的輸出資訊與
不受限方式的啟動命令的資訊相同。資料庫已開啟,如果非特權使用者試圖登入,則將出現
下列錯誤資訊:
        使用alter system disable restricted session可以使資料庫處於非約束訪問方
式,使用者可以再次登入。


5).強制啟動(Startup Force)
當不能關閉資料庫時,採用強制啟動先項可處理這種罕見狀態。首先關閉資料庫,然後執
行無選項的資料庫啟動操作。啟動操作與執行“Startup”命令相同。啟動伺服器管理後,
按下述步驟操作:
   SVRMGR>connect internal;
   SVRMGR>Startup force

    完成上述操作後,資料庫被開啟,使用者可訪問資訊。


6).帶初始化引數啟動(Startup Pfile)
啟動命令使用該選項不影響資料庫的執行方式,而只是定義了初始化引數檔案(pfile)的
名稱及位置。正如前面所討論,初始化引數檔案由Oracle開啟資料庫時讀取。Oracle期望
已定位的預設的初始化引數檔名。
   SVRMGR>connect internal;
   SVRMGR>Startup pfile= parameter_file_name

關閉選項
當Oracle資料庫不執行時,稱其為停止(down)。關閉資料庫有多種理由,有些軟體做備
份時關閉資料庫;當升級或安裝一些新的Oracle軟體時,在升級或安裝對話期間,Oracle
資料庫必須關閉。

Showdown immediate 立即關閉,絕大多數情況下使用這種關閉方式。在使用者別無選擇時使
用shutdown abort選項關閉資料庫,這是作為最後一種手段,非不得已的情況下才用。如
果使用中止(abort)選項關閉資料庫,應立即啟動資料庫再做一次正常關閉,經驗表明這
是處理中止關閉的最好辦法。

       
  二.使用者及使用者許可權管理
建立使用者

建立一個使用者,實際上是建立一個安全、有用的帳號,它具有適當的許可權和正確的預設設
置。使用create user命令要建立一個新的資料庫帳戶,當該帳戶建立後,在授權前它沒有
任何效力,甚至不能註冊。
所有使用者帳號所需的設定都可由一個create user命令來指定。這些設定可以包括下表所有
的引數值。
   參    數                    使    用
Username 模式名
Password 帳號口令,也可以是直接與作業系統主機帳號相連
Default Tablespace 預設表空間用來儲存在該模式下建立的物件。這個並不是真正給使用者
建立的物件,而僅是設定一個預設值
Temporary Tablespace 這個表空間只用來儲存排序處理的臨時段
Quota  [on tablespace] 充許使用者在限額指定尺寸的表空間儲存物件
Profile 給使用者指定一個環境檔案。如未指定,則使用預設環境檔案。環境檔案是用來限
制對系統資源的使用的執行口令管理規則  
   下面列出一個簡單的create user命令。在這個例子中,建立一個叫Rudolf和反使用者,
口令為la