首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sqlplus常用命令应用

2012-08-11 
sqlplus常用命令使用show和set命令是两条用于维护SQL*Plus系统变量的命令SQL show all --查看所有68个系

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和反用户,
口令为lamb,缺省表空间为USERS,临时表空间为TEMP,没有限额,使用缺省环境文件。

   Create user rudolf
      Identified by lamb
      Default tablespace USERS
      Temporary tablespace TEMP;

由于没有指定环境文件,数据库使用缺省环境文件。环境文件名为DEFAULT;其初始值是由
UNLIMITED设置的所有资源消耗的限值。
由于没有指定限额,用户就不能在数据库建立对象。
当授权资源限额时,使用create user或alter user的quota参数,如下面所列出的。这个
例子中,授予rudolf的限额为USERS表空间的10MB。
Alter user rudolf 
   Quota 10M on users

这时用户Rudolf可以在USERS表空间中建立最多为10M的数据段。用户不需要临时表空间中
空间限额来建立他们查询时的临时段。
除用户名外,create user命令的参数都可以由alter user命令来替换。



2.删除用户

  可以用drop user命令来把一个用户从数据库中完全删除。这个命令只有一个参数——c
ascade,它能删除用户模式中的所有对象。如果是用户固有对象,为删除用户,你必须先
指定cascade。下面举例说明drop user命令:
drop user rudolf cascade

   任何视图、同义词、过程、函数或数据包等被引用的对象在删除用户都会标上INVALID
。如果不久后另一个用户建立一个同样的名字,那么他在他的前任用户继承不到任何东西
。 

   
3.系统级权限
  
   可以使用系统级角色分配有效的系统级命令,以管理数据库。也可以建立用户系统级角
色或使用自身所带的有效权限,可以通过系统级角色授予,见下表:

   权限 授权能力
对象管理
CREATE [ANY] CLUSTER
CREATE [ANY] DIRECTORY
CREATE [ANY] INDEX
CREATE [ANY] LIBRARY
CREATE [ANY] PROCEDURE
CREATE [ANY] SEQUENCE
CREATE [ANY] SNAPSHOT
CREATE  ANY SYNONYM
CREATE [PUBLIC] SYNONYM
CREATE [ANY] TABLE
CREATE [ANY] TRIGGER
CREATE [ANY] TYPE
CREATE [ANY] VIEW
ALTER [ANY] CLUSTER
ALTER [ANY] INDEX
ALTER [ANY] PROCEDURE

DROP ANY CLUSTER
DROP ANY DIRECTORY
DROP ANY

BACKUP ANY TABLE
COMMENT ANY TABLE
LOCK ANY TABLE
SELECT ANY TABLE
INSERT ANY TABLE
UPDATE ANY TABLE
DELETE ANY TABLE
EXECUTE ANY TYPE
EXECUTE ANY PROCEDURE
数据库管理
CREATE [PUBLIC] DATABASE LINK
CREATE PROFILE
CREATE ROLE
CREATE ROLLBACK SEGMENT
CREATE TABLESPACE
CREATE USER
ALTER PROFILE
ALTER  RESOURCE COST
ALTER ANY ROLE
ALTER ROLLBACK SEGMENT
ALTER TABLESPACE 
ALTER USER
DROP PROFILE
DROP PUBLIC DATABASE LINK
DROP ANY ROLE
DROP ROLLBACK SEGMENT
DROP TABLESPACE
ALTER DATABASE
ALTER SYSTEM
ANALYZE ANY
ANUDITANY AUDIT SYSTEM
BECOME USER
FORCE [ANY] TRANSACTION
GRANT ANY PRIVILEGE
GRANT ANY ROLE
MANAGER TABLESPACE
RESTRICTED SYSTEM
SYSDBA   可以建立数据库一样执行系统管理功能(recover、startup、shutdown)
SYSOPER   可以执行与数据库备份、启动/关闭有关的系统管理功能(装载、恢复、打开和
关闭数据库)

   使用grant命令给用户授权,grant命令的子句with grant option,是用于给被授予都
传递授予用户权限的能力。
   Oracle提供了8个系统级角色。它们分别是CONNECT,RESOURCE,DBA,IMP_FULL_DATAB
ASE,EXP_FULL_DATABASE,SELECT_CATALOG_ROLE,EXECUTE_CATALOG_ROLE和DELETE_CATALOG
_ROLE。使用这些角色可以用来限制数据库管理角色的系统级权限。
  CONNECT角色是授予最终用户的典型。尽管它具有一些建立对象的能力(如CREATE TABL
E权限),但它不能给用户任何表空间的额度。由于用户没有表空间,所以也就不能建表。
 
  RESOURCE角色是授予开发人员的,是开发人员最有效的角色。
  DBA角色包括了所有的系统级权限。
  IMP_FULL_DATABASE和EXP_FULL_DATABASE是分别用于执行整个数据库输入、输出操作。
这些角色是DBA角色的一部分,可以使用这些角色来授予用户有限的数据库管理权限。
SELECT_CATALOG_ROLE、EXECUTE_CATALOG_ROLE和DELETE_CATALOG_ROLE角色是Oracle8新增
的。
如果用户被授予DELETE_CATALOG_ROLE角色,用户就可以从表SYS.AUD$中删除记录,SYS.A
UD$表是写审计记录的表。
SELECT_CATALOG_ROLE和EXECUTE_CATALOG_ROLE角色是给用户授予选择和执行输出表数据字
典对象的权限。

  现在,我们建立一个新的系统级角色,叫做ACCOUNT_CREATOR。它只能建立用户而不能任
何其他DBA命令。建立这个角色的命令如下:
     
     create role ACCOUNT_CREATOR;
     grant CREATE_SESSION,CREATE USER,ALTER USER
        to ACCOUNT_CREATRO;

一个用户可能被授予多个角色,可以通过alter user命令的子名default role来修改一个
用户的缺省角色。例如,可以修改使用用户不允许有缺省角色:

    alter user rudolf default role none;

可以指定角色允许:
alter user rudolf default role CONNECT;

可以指定角色在对话开始时禁止。
Alter user rudolf default all except ACCOUNT_CREATOR;


4.用户环境文件
 
    可以使用环境文件来限制系统和数据库资源向用户开放和管理口令限制。如果数据库
中没有建立环境文件,则用缺省环境文件,它对所有用户开放,资源没有限制。
通过资源环境文件可以限制用户以下资源:

SESSIONS_PER_USER 在一种情况下一个用户可以同时有多个对话
CPU_PER_SESSION 一个对话可用数个百分之一秒
CPU_PER_CAL 语法分析、执行、取数可用数个百分之一秒
CONNECT_TIME 一个数据库可连接数分钟的对话
IDLE_TIME 允许处在非激活状态的分钟数
LOGICAL_READS_PER_SESSION 一个对话可以读数个数据块
LOGICAL_READS_PER_CALL 在一个分析、执行、取数据期间可以读数个数据库块
PRIVATE_SGA 一个对话的私有空间可分配在SGA的shared SQL poos(对于MTS)
COMPOSITE_LIMIT 一个复合式限制,它是基于前面的限制
FAILED_LOGIN_ATTEMPS 连续多次注册失败引起一个帐号死锁
PASSWORD_LIFE_TIME 一个口令在其终止前可用天数
PASSWORD_REUSE_TIME 一个口令必须过几于才能重用
PASSWORD_REUSE_MAX 一个口令在重新使用前必须改变次数
PASSWORD_LOCK_TIME 如超过了FAILED_LOGIN_ATTEMPS设置次数,一个帐号将被锁住天数

PASSWORD_GRACE_TIME 当已达到PASSWORD_LIFE_TIME时之后的缓期天数
PASSWORD_VERIFY_FUNCTION 一个函数名,用于判断口令的组成,由Oracle提供并可编辑

  注意:PASSWORD_REUSE_MAX和PASSWORD_REUSE_TIME是不相容的。如果设置了其中一个的
值,则另一个必需为UNLIMITED。

环境文件是通过create profile建立的, 可以通过alter profile对已有的环境文件进行修
改。

例:如果设置用户环境文件的FAILED_LOGIN_ATTEMPS资源为5,该帐号允许被连续注册失败
5次,第6次就会引起帐号死锁。下面列出建立LIMITED_PROFILE环境文件,用户名为JANE:

Create  profile LIMITED_PROFILE limit 
    FAILED_LOGIN_ATTEMPS 5;

Create  user JANE identified by HELLO 
      Profile LIMITED_PROFILE;

Grant CREATE SESSION to JANE;

   如果现在JANE帐号连续6次失败,那么失败该帐号就会被Oracle自动锁住。要对帐号解
锁,在DBA帐号下使用如下命令:
   alter user JANE account unlock;

注册期间的口令安全
    当从一个客户机器与数据库服务器连接或通过数据库链接从一个数据库连接到另一个
时,Oracle将输入的口令以非加密形式传送,除非指定其他形式。对于Oracle8,可以设置
参数来强制Oracle传送前对口令值编码。要允许口令加密,需
设置以下参数:
对客户机,把sqlnet.ora文件的ORA_ENCRYPT_LOGIN参数设为TRUE。
对服务器,把init.ora文件的DBLINK_ENCRYPT_LOGIN参数设置为TRUE。

当设置这些参数后,并且数据库关闭和重启动,口令以加密形式在客户机到服务器和服务
器到服务器之间传送。

  三.表空间管理
存储参数意义
一个段所使用的空间由它的存储参数决定。这些参数又是在段生成时,由数据库来确定的
;如果在create table 、create  index、create cluster或create rollback segment命
令中,没有指明存储参数,则会使用表空间中存储的缺省参数。存储参数指定了initial(
初始化)扩展块尺寸,next(下一个)扩展块尺寸,以及pctincrease、maxextents、minextents值。在段生成后
,不能改变initial和minextents值。每一个表空间的缺省存储参数一般存储在DBA_TABLE
SPACE和USER_TABLESPACE视图中。
Pctincrease为扩展块数据量增长的百分比值。比如一个initial 为20,next为20,pctinc
rease为50的一个数据段中,扩展块以下列的方式增长:
  扩展数    块数 总块数 扩展容量
1 20 20 Initial
2 20 40 Next
3 30 70 Next*1.5
4 45 115 Next*1.5*1.5

   表空间在多次分配与回收其空间之后,会出现一个自由空间碎片,后台进程SMON会周期
性地合并表空间内相邻的自由范围,然而,如果表空间缺省的pctincrease 为0,则不会自
动实现空间合并。所以一般我们至少设置pctincrease为1。当然,我们也可以使用SQL命令
强制合并表空间中相邻的自由空间:
  alter tablespace data coalesce;

增加空间至已有表空间
   我们知道,一个表空间由一个或多个数据文件组成,当一个表空间将被用尽时,除非其
所用的数据文件有自动扩展,否则我们必须为其增加新的数据文件。数据库创建时指定的
那几个数据文件都没有自动扩展选项。
   比如我们可以用以下命令给USERS表空间增加空间
   ALTER TABLESPACE "USERS" 
          ADD DATAFILE '/oracle/ctl2/oradata/ora/users_data.dbf' 
          SIZE 1000K 
          AUTOEXTEND ON 
          NEXT 100K 
          MAXSIZE 10M;
   
新建表空间
数据库建立时只创建了SYSTEM、RBS、TEMP、TOOLS、USERS这几个表空间,随着应用的增长
,你可能想把自己的应用建立在一个新的表空间上,或是想把不同的应用建立在不同的表
空间之上,这时,我们就必须建立新的表空间。
例如,我们用以下命令创建了一个myapp的表空间:
CREATE TABLESPACE myapp 
     DATAFILE '/oracle/ctl3/oradata/ora/myapp_data.dbf'
         SIZE 5M 
         AUTOEXTEND ON 
         NEXT 1M 
    

热点排行