Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1198455
  • 博文数量: 253
  • 博客积分: 5892
  • 博客等级: 大校
  • 技术积分: 1942
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-24 14:20
文章分类

全部博文(253)

文章存档

2012年(98)

2011年(155)

分类: Oracle

2011-11-13 18:50:28

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.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 
 或 alter user sys identified by  
    以上命令可以在服务器管理器状态下执行,也可以在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 
   set pagesize 
 例:
  SQL>set linesize 80;
  SQL>set pagesize 25;

2) 页头标、页脚标
   ttitle  
   btitle  

 例:  (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型。我们将在以后介
绍。
变量作用域
   变量在仅它所在的块内块内是可见的。
<>
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;
        Pr
阅读(1748) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~