ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQLPLUS中几个常用命令———摘自网络

SQLPLUS中几个常用命令———摘自网络

原创 Linux操作系统 作者:ForTechnology 时间:2011-08-04 21:33:18 0 删除 编辑
SQLPLUS中几个常用命令
上一篇 / 下一篇  2010-08-27 16:10:13
查看( 450 ) / 评论( 3 ) / 评分( 10 / 5 )
SQL> set echo on—————————————————设置运行命令是是否显示语句
SQL> set feedback on———————————————-设置显示“已选择XX行”
SQL> set colsep | —————————————————设置列与列之间的分割符号
SQL> set pagesize 10———————————————–设置每一页的行数
SQL> SET SERVEROUTPUT ON——————————-设置允许显示输出类似dbms_output.putline
SQL> set heading on————————————————设置显示列名
SQL> set timing on————————————————–设置显示“已用时间:XXXX”
SQL> set time on—————————————————–设置显示当前时间
SQL> set autotrace on———————————————–设置允许对执行的sql进行分析
sqlplus sys/sys@DODO as sysdba
sqlplus /as sysdba
sqlplus /nolog
SQL>conn sys/sys@DODO as sysdba
    1、执行一个SQL脚本

    SQL> start D:\a.sql
    SQL> @ D:\a.sql
    注:若需要在一个脚本中调用另一个脚本,则使用 @@D:\a.sql

    2、重新执行上一次命令:

    SQL> /              --也可使用 run/r 来替代执行

    3、编辑脚本:

    SQL> edit            --编辑当前输入的文本(前1次执行的部分)
    SQL> edit D:\a.sql  --编辑制定文档
    注:在txt中编辑完成后保存,关闭即修改完成,使用“/”后运行

    4、保存脚本:

    SQL> save a          --自动存档为a.sql 保存在C:\Documents and Settings\wangxiaoqi
    SQL> save D:\a      --保存到D:\a.sql

    5、导入脚本:

    SQL> get D:\a

    6、显示一个表结构:

    SQL> desc tab        --如果tab不是表,则只显示其类型和名字

    7、保存所有输入:

    SQL> spool D:\xxx    --建立一个xxx.LST文件
    SQL> spool            --显示当前spool状态
    SQL> select * from dual;
    SQL> spool off      --结束录入
    
    8、执行过程
    SQL> execute  a;

    9、增加页眉和页脚:

    SQL> TTITLE abc      --添加页眉“abc”
    SQL> BTITLE def      --添加页脚“def”
    SQL> TTITLE OFF      --取消页眉显示

三、COLUMN[COL]命令修改字段属性:

    可以修改的属性有:
    ALI[AS] alias
    CLE[AR]
    FOLD_A[FTER]
    FOLD_B[EFORE]
    FOR[MAT] format
    HEA[DING] text
    JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
    LIKE { expr|alias}
    NEWL[INE]
    NEW_V[ALUE] variable
    NOPRI[NT]|PRI[NT]
    NUL[L] text
    OLD_V[ALUE] variable
    ON|OFF
    WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
    注:若不同表的同列名,会一起改掉!

    1、HEADING--改变字段名

    SQL> COLUMN id HEADING 'XX|YY'  --使用'|'可将列名显示为两行

    2、FORMAT--改变字符长度 & 格式化数值

    SQL> COLUMN id FORMAT a20      --此字段长20个字符,只能针对字符,若为数字则无法正常显示
    SQL> COLUMN id FORMAT $999.00  --前缀$,小数点前3位,小数点后2位四舍五入

    3、JUSTIFY--改变字段名显示位置

    SQL> COLUMN id JUSTIFY center  --居中显示,默认的都是靠右(r )显示

    4、NOPRINT--不显示

    SQL> COLUMN id NOPRINT          --不显示出来,可用PRINT设置回来

    5、NULL--设置NULL值显示

    SQL> COLUMN COMM NULL 0.00      --将NULL值设置位0.00  注意必须加上COMM  注:不起作用。 

    6、WRAPPED--设置回绕方式

    SQL> COLUMN id FORMAT a5        --设置长度为5
    SQL> COLUMN id WRAPPED        --表示直接按长度回绕
    SQL> COLUMN id WORD_WRAPPED  --按单词回绕
    SQL> COLUMN id TRUNCATED      --直接按长度截断

    7、COLUMN--显示当前列所有属性

    SQL> COLUMN id                  --后面不加列名时显示所有的COLUMN

    8、OFF|ON--设置某一字段关闭

    SQL> COLUMN id OFF

    9、CLEAR--清空所有字段属性

    SQL> CLEAR COLUMNS



四、SQL*Plus的系统参数:

    show all        --显示所有系统参数的当前值
    show [参数]      --显示某个系统参数值
    set  [参数][值]  --设置系统参数值

    appinfo is OFF and set to "SQL*Plus"
    arraysize 15
    SQL*Plus一次从oracle获取的行数,设置越大可提高效率,但是对内存有要求,1000以上效果不大
    autocommit OFF
    针对session的自动提交 SQL> SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}  --有IMM[EDIATE]则无需再ON
    autoprint OFF
    autorecovery OFF
    autotrace OFF
    设置可以对执行的SQL进行分析 SQL> SET AUTOTRACE ON
    blockterminator "." (hex 2e)
    btitle OFF and is the first few characters of the next SELECT statement
    cmdsep OFF
    colsep " "
    设置列与列之间的分割符号 SQL> SET COLSEP '|'
    compatibility version NATIVE
    数据库版本,NATIVE为默认,可制定V6,V7,V8
    concat "." (hex 2e)
    copycommit 0
    COPYTYPECHECK is ON
    define "&" (hex 26)
    替换变量时所使用的字符
    describe DEPTH 1 LINENUM OFF INDENT ON
    echo OFF
    是否显示执行代码 SQL> SET ECHO {ON|OFF}
    editfile "afiedt.buf"
    embedded OFF
    escape OFF
    FEEDBACK ON for 6 or more rows
    查询、修改时所影响的行数 SQL> SET FEED[BACK] {6|n|ON|OFF}
    flagger OFF
    flush ON
    heading ON
    是否显示列标题 SQL> SET HEA[DING] {ON|OFF}
    headsep "|" (hex 7c)
    instance "local"
    linesize 100
    设置一行可容纳的字符数 SQL> SET LIN[ESIZE] {80|n}
    lno 8
    loboffset 1
    logsource ""
    long 5000
    longchunksize 80
    markup HTML OFF ...
    newpage 1
    页与页之间的分隔符 SQL> SET NEWP[AGE] {1|n|NONE}
              当set newpage 0 时,会在每页的开头有一个小的黑方框。
              当set newpage n 时,会在页和页之间隔着n个空行。
              当set newpage none 时,会在页和页之间没有任何间隔。
    null ""
    设置null值  SQL> SET NULL 0.00
                    但是此值显示出来后必为字符型
    numformat ""
    numwidth 10
    设置number类型的长度限制 SQL> SET NUM[WIDTH] 16
    pagesize 9999
    一页显示多少行 SQL> SET PAGES[IZE] {24|n}
                    当设置为0时,则所有行显示在一页中,并且不显示标题行
    PAUSE is OFF
    pno 1
    recsep WRAP
    recsepchar " " (hex 20)
    release 1002000100
    repfooter OFF and is NULL
    repheader OFF and is NULL
    serveroutput ON SIZE 1000000 FORMAT WORD_WRAPPED
    输出DBMS.OUTPUT时是否显示 SQL> SET SERVEROUT[PUT] {ON|OFF} [size n]
    shiftinout INVISIBLE
    showmode OFF
    spool OFF
    sqlblanklines OFF
    sqlcase MIXED
    sqlcode 0
    sqlcontinue "> "
    sqlnumber ON
    sqlpluscompatibility 10.2.0
    sqlprefix "#" (hex 23)
    sqlprompt " wangxiaoqi@DODO > "
    sqlterminator ";" (hex 3b)
    suffix "sql"
    tab ON
    termout ON
    是否显示输出内容,例如spool输出  SQL> SET TERM[OUT] {ON|OFF}
    timing OFF
    SQL语句执行花费时间显示  set TIMING  {ON|OFF}
    trimout ON
    标准输出中每行最后的空格是否去掉 SQL> SET TRIMS[OUT] {ON|OFF}
    trimspool ON
    spool标准输出中每行最后的空格是否去掉 SQL> SET TRIMS[OUT] {ON|OFF}
    ttitle OFF and is the first few characters of the next SELECT statement
    underline "-" (hex 2d)
    USER is "WANGXIAOQI"
    verify ON
    wrap : lines will be wrapped
    当长度超过时是否回绕  SQL> SET WRA[P] {ON|OFF}  --基本上都要ON



五、一些常用的小操作:

    show user                      --查看当前登录用户
    show errors                    --显示错误信息
    show rel[ease]                --显示版本
    show SGA                      --显示SGA
    set time on                    --前端始终显示时间
    select name from v$database;  --查看当前所在数据库
    select * from v$instance;      --查看所有数据库实例(似乎没什么用)
    select * from V_$PWFILE_USERS; --查看那些用户有SYSDBA/SYSOPER权限
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  <br>  btitle  <Foot title string> <br>例:  (connect as scott) <br>  SQL>ttitle ‘Database Technoloies| Customer Report’; <br>  SQL>select empno,ename from emp; <br>  SQL>btitle ‘-----------Sample.sql------------‘; <br>  SQL>select empno,ename from emp; <br>  <br>  |  表示换行。 <br><br>3).SQL*Plus结果到文件 <br>  spool  <目标文件> <br>  如:spool  c:\temp\out.list <br>  这个输出将放在spool命令指定的文件中。为停止假脱机(spooling),可用命令spool o<br>ff或spool out。后者关闭输出文件并打印输出。 <br>4).格式化输出列表 <br>column <br>大多数情况下,用户需要格式化实例的表列数据。Column命令可完成这项工作。下面我们<br>先执行两条格式化命令,然后再查询customer表。 <br>  SQL>column last_name format a8 wrap heading ‘Last |Name’; <br>  SQL>column state_cd format a8 heading ‘State | Code’ ; <br>  <br>                  8  表示显示宽度, <br>                a  表示每个位置只能是字符 <br>                wrap 说明若last_name长度大于8个字符,多余的字符显示下一行的对应<br>位置。 <br>                Heading 部分告诉SQL*plus,last_name的列标。 <br>  现在我们查询一下customer表来看不下输出效果: <br>SQL>select * from customer ; <br>Sun Jul 04                                                      page    1 <br>                            Database Technologies <br>                                Customer Report <br>Last    State <br>Name    Code      SALES <br>-------- -- ---------- <br>Teplow  MA  23445.67 <br>Abbev    CA    6969.96 <br>Porter  CA    6989.99 <br>Martin  CA    2345.45 <br>Laursen  CA      34.34 <br>Bambi    CA    1234.55 <br>McGraw  NJ    123.45 <br>              -------------------sample.sql--------------------- <br><br>本章小结: <br>本章简要地介绍了SQL及其一些常用的命令,及SQL*Plus的应用。有关SQL的更详细的使用<br>说明可以参阅本第4章至第8章,课本在从建表到查询等操作都有较为详细的介绍,虽然书<br>中的章节较长,但其内容简单易懂,由于课时所限无法在此逐一介绍。建议大家可以在自<br>己的PC上安装个Personal Oracle 8,按课本的例子,进行学习试验。 <br><br>第五章.PL/SQL <br>    前面我们所使用的SQL语言,它不具备过程能力,但Oracle通过PL/SQL语言对SQL进行<br>了过程语言功能的扩展。PL/SQL是一种比较复杂的的程序设计语言,用于从不同环境中访<br>问Oracle数据库,。 <br>PL/SQL是Procedural Language/SQL(过程性语言的缩写)。正如其名所表达的,PL/SQL通<br>过增加了用在其他过程性语言中的结构(construct)来对SQL进行了扩展,例如: <br>变量和类型(包括预定义的和用户定义的) <br>控制结构,例如IF-THEN-ELSE语句和循环。 <br>过程和函数 <br>对象类型和方法 <br>    过程性结构与Oracle SQL无缝地集成在一起,这样便产生了一种结构化的强有力的语<br>言。在使用Oracle的存储过程、数据库触发器、包和函数都要用PL/SQL编写代码。因此,<br>如果不了解PL/SQL就不能深入掌握Oracle。 <br>    PL/SQL具有高度的可移植性,在所有Oracle平台上都是标准化的。因为其数据类型基<br>于数据库服务器,所以语言完全与机器无关。你无需针对UNIX、Windows、Netware等等去<br>学习各种PL/SQL。PL/SQL程序可以在任何Oracle Server上编译和运行而无需进行任何修改<br>。 <br><br>一.PL/SQL基础    <br>下面我们通过实例程序来学习PL/SQL: <br>首先我们可以运行一下hello.sql这一简单的程序,此程序输出”Hello,world!”。 <br>Hello.sql <br>SET SERVEROUTPUT ON <br>BEGIN <br>  DBMS_OUTPUT.enable; <br>  DBMS_OUTPUT.put_line(‘Hello, world!’); <br>END; <br>/ <br>  启动SQL*plus并以system帐号连接Oracle. <br>SQL>start c:\plssql\hello.sql  <br>  用以上命令运行些程序。 <br>  第1行让SQL*Plus写出服务器返回给它的内容。 <br>  第2行和第5 行提供当前块的作用范围。 <br>  第3行打开输出机制。 <br>  第4行打印簇“Hello, world!”。 <br>  第6行执行这个无名PL/SQL块。 <br>服务器响应如下: <br>Hello, World! <br>PL/SQL过程已成功完成. <br>SQL> <br>    在PL/SQL中字符串用单引号围起来,PL/SQL对文字大小写唯一敏感的地方是在字符串<br>是,对一些变量、命令等大小写不敏感。 <br>数据文字可以任何整数或浮点数值,例如: <br>整数文字 <br>-12345.0            浮点数文字 <br>1234.567890          浮点文字可以是任意精度 <br>这也是浮点文字,精度为零 <br>1.2345E2            可以使用科学计数 <br>1.2345E-3 <br>    0.123 或 .123        开头的0是可选择的 <br>下面我们再来看另一个程序: <br>Circle.sql <br>DECLARE <br>  PI CONSTANT REAL:=3.14159265359;  -- PI常量值 <br>  Circumference REAL;          --周长 <br>  Area REAL;                  --面积 <br>  Radius REAL:=&Radius;        --半径 <br>BEGIN <br>  Circumference:=PI*radius*2.0; <br>  Area:=PI*radius**2; <br>  DBMS_OUTPUT.put_line(‘Radius=’||To_CHAR(radius)|| <br>                        ’,Circumference=’||To_CHAR(circumference)|| <br>                        ‘,Area=’||To_CHAR(area)); <br>END; <br>/ <br>SQL> start c:\plsql\circle.sql <br>在运行这个程序时,SQL*Plus首先提示你给&号指定的联编变量指定一个值(第5行)屏幕<br>显示信息为: <br>输入radius的值: 5 <br>原值  5:  Radius REAL:=&Radius; <br>新值  5:  Radius REAL:=5; <br>Radius=5,Circumference=31.4159265359,Area=78.53981633975 <br>PL/SQL 过程已成功完成。 <br>  SQL> <br>程序注释 <br>单行注释 <br>  单行注释由两个连字符开始,后面一直到行尾都是注释(回车符标识着注释的结束)。<br>如上边程序中的: <br>          PI CONSTANT REAL:=3.14159265359;  -- PI常量值 <br>    如果行注释超过一行,必须在每一行的开头上使用双连字符(--)。 <br>多行注释 <br>多行注释由/*开始,由*/结束。这是C语言中使用的注释风格。如circle.sql中的开头部分<br>所示。 <br>多行注释可以扩展到任意多的行上,但它们不能嵌套。 <br>PL/SQL块结构 <br>PL/SQL块是基本的编程结构,用块结构进行编程适用于自上而下的结构化积木式编程和直<br>观逻辑组织。 <br>一个无名PL/SQL块有三部分:说明部分、正文(体)部分和异常部分。其中异常部分为可<br>选项。 <br>    DECLARE <br>---- declarations (说明) <br>BEGIN <br>      ----executable code(执行代码) <br>EXCEPTION <br>    ----  exception handlers(异常处理代码) <br>END; <br>实际上说明部分也是可选项,但不声明变量是不能执行实质性的工作。用户定义的全部变<br>量、常数、数据类型、指示器、函数和过程均在这一部分中说明。若没有定义其中任何一<br>个,你可以略去这一部分。 <br>变量声明 <br>  PL/SQL提供了SQL没有的附加数据类型。除一般的Oracle SQL数据类型外,PL/SQL还可<br>以让您用用这些数据类型对变量进行说明: <br>  BOOLEAN  布尔类型      可用预定义常量TRUE、FALSE或NULL对一个布尔变量赋值。<br>  BINARY-INTEGER          该类型适用于在-2,147,483,647到2,147,483,643 <br>  (二进制整数)                范围内的带符号整数 <br>  NATURAL(自然数)          是BINARY-INTEGER的一个子集,这种数据类型是整数集的<br>一部分,从0到2,147,483,647。 <br>  POSITIVE(正整数)        是BINARY-INTEGER的另一个子集, 这种数据类型是整数<br>集的一部分,从0到2,147,483,647。 <br>  %TYPE                    这种设计可使您说明一个变量的数据类型与某一指定列的<br>数据类型相同,其结果产生更易于维护的PL/SQL代码。 <br>  %ROWTYPE                用这种数据类型您可以说明一个复合变量,与一特定表中的<br>一行相同,这种复合变量是由引用表中的列名和数据类型组成的。 <br>  除此之外,PL/SQL还提供两种复合数据类型:TABLE类型和RECORD型。我们将在以后介<br>绍。 <br>变量作用域 <br>  变量在仅它所在的块内块内是可见的。 <br><<l_outer>> <br>DECLARE <br>  V_AvailableFlag BOOLEAN; <br>  V_SSN        NUMBER(9); <br>BEGIN <br>fds <br>DECLARE <br>  V_SSN    CHAR(11); <br>BEGIN <br>      --v_SSN(char 11)是可见的,要引用v_SSN(number 9)可用 <br>        -- l_outerV_SSN <br>END; <br>END; <br>变量名风格 <br>变量名的关键是它们是描述性的。声明 <br>x number; <br>不会告诉您有关x的用途的任何事情。但是 <br>v_StudenID  NUMBER(5); <br>将告诉我们该变量可能要用来存储学生ID号,尽管在声明旁边没有解释的注释。请记住,<br>PL/SQL标识符的最大长度是30个字符,所有的字符都可以用来传递一些含义的。30个字符<br>通常足以用来存储一个描述性的名称了。 <br>变量名也可以告诉我们该变量的用途。有的人使用下划线将一个字母代码和变量的其他部<br>分分隔来以指明这一点。例如: <br>v_VariableName        程序变量 <br>e_ExceptionName      用户定义异常 <br>t_TypeName            用户定义类型 <br>p_ParameterName      过程或函数参数 <br>c_ConstantValue        常量 <br><br><br>  下面我们再来看一个程序, loop.sql  (参见课本P198) <br>CREATE TABLE test_table (record_number number(3),current_date date); <br>DECLARE <br>  max_records CONSTANT int:=100; <br>  I  int:=1; <br>BEGIN <br>  FOR I in 1..max_records LOOP <br>    If  (mod(i,10)=0)  then <br>      INSERT INTO test_table <br>          (record_number,current_date) <br>      VALUES <br>          (I, SYSDATE); <br>    ELSE <br>      NULL; <br>    END IF; <br>  END LOOP; <br>  COMMIT; <br>END; <br>/ <br>COLUMN current_date FORMAT a20 <br>SELECT  record_number,to_char(sysdate,'HH24:MI SS')  FROM test_table; <br>    DROP TABLE test_table; <br>循环语句 (P.195) <br>FOR-LOOP 与 WHILE-LOOP  <br>  语法: <br>FOR loop variable IN [REVERSE] lower-bound..upper-bound LOOP <br>  Statement; … statemnet; <br>END LOOP; <br>    WHILE condition LOOP <br>      Statement; … statement; <br>    END LOOP; <br>    Condition是一个有效的PL/SQL条件; <br>    Statement是一个有效的PL/SQL语句。 <br>  <br>简单的LOOP语句 <br>  语法: <br>LOOP  <br>  Statement; … statement; <br>END LOOP; <br>无条件循环,为了跳出循环,可在当一个条件被满足时执行EXIT语句。 <br>  EXIT语句: <br>EXIT  [lable-name]  WHEN condition; <br>  <br>IF语句 <br>  IF  condition THEN <br>Statement;  … statement; <br>[ELSIF  condition  THEN  <br>  Statement;  … statement; <br>  … <br>[ELSIF  condition THEN <br>  statement; … statement; <br>[ELSE  <br>  statement;  … statement;] <br>END IF; <br>  注意拼写:是ELSIF而不是ELSEIF;END IF而不是ENDIF。 <br><br>使用过程 <br>  过程是执行少量重复工作、严格地通过参数列表传入和传出值的子例行程序。 <br>  Table.sql  <br>SET SERVEROUTPUT ON <br>DECLARE  <br>  --  常量 <br>  TB CONSTANT VARCHAR2(1):=CHR(9);  -- TAB <br>  --  变量 <br>  status NUMERIC; <br>  table_rec  all_tables%ROWTYPE; <br>  --  例程  <br>  PROCEDURE get_table(Powner    IN      all_tables.owner%TYPE, <br>                    Ptable    IN      all_tables.table_name%TYPE, <br>                      Prec      OUT      all_tables%ROWTYPE, <br>                      Pstatus    IN  OUT NUMBER) IS <br>    -- Local cursors <br>    CURSOR table_cur (Cowner all_tables.owner%TYPE, <br>                      Ctable all_tables.table_name%TYPE) IS <br>      SELECT  *  <br>          FROM all_tables <br>          WHERE wner=Cowner AND table_name = Ctable; <br>    -- 局部变量 <br>    Lowner  all_tables.owner%TYPE; <br>    Ltable  all_tables.table_name%TYPE; <br>  BEGIN <br>    Pstatus:=0;    -- OK <br>    Lowner:=UPPER(Powner); <br>    Ltable:=UPPER(Ptable); <br>    OPEN table_cur(Lowner, Ltable); <br>    FETCH table_cur INTO Prec; <br>    IF (table_cur%NOTFOUND) THEN <br>      RAISE NO_DATA_FOUND; <br>    END IF; <br>      CLOSE table_cur; <br>    EXCEPTION <br>      WHEN OTHERS THEN <br>      BEGIN <br>        Pstatus:=SQLCODE;  -- 捕获错误代码 <br>        IF (table_cur%ISOPEN) THEN <br>          CLOSE table_cur; <br>        END IF; <br>        Prec:=NULL; <br>        DBMS_OUTPUT.put_line('get_table:'||SQLERRM(Pstatus)); <br>        DBMS_OUTPUT.put_line('OWNER='||'<'||Lowner||'>'); <br>        DBMS_OUTPUT.put_line('TABLE ='||'<'||Ltable||'>'); <br>      EXCEPTION <br>        WHEN OTHERS THEN <br>          NULL;  --don't care(avoid infinite loop) <br>      END; <br>  END get_table; <br>BEGIN <br>  DBMS_OUTPUT.enable; <br>  DBMS_OUTPUT.put_line('TABLE'||TB||'TABLESPACE'||TB|| <br>                      'INITIAL'||TB||'NEXT'||TB||'MAX'); <br>  DBMS_OUTPUT.put_line(RPAD('-',43,'-'));  -- Just an under line <br>  Get_table('scott','dept',table_rec,status); <br>  IF (status=0) THEN <br>    DBMS_OUTPUT.put_line( <br>        Table_rec.table_name      ||TB|| <br>        Table_rec.tablespace_name  ||TB|| <br>        Table_rec.initial_extent  ||TB|| <br>        Table_rec.next_extent      ||TB|| <br>        Table_rec.max_extents); <br>  END IF; <br>  Get_table('scott','garbage',table_rec,status); <br>  IF (status =0 ) THEN <br>    DBMS_OUTPUT.put_line( <br>        Table_rec.table_name      ||TB|| <br>        Table_rec.tablespace_name  ||TB|| <br>        Table_rec.initial_extent  ||TB|| <br>        Table_rec.next_extent      ||TB|| <br>        Table_rec.max_extents); <br>  END IF; <br>END; <br>/ <br>游标的使用: <br>    参阅课本P.251 <br>    说明游标 (declare) <br>    打开(open)游标 <br>    用游标提取数据行(fetch) <br>    关闭(close)游标 <br>定义过程: <br>PROCEDURE  procedure-name [(argument1[,argumentN])]  IS <br>[局部变量声明] <br>BEGIN <br>  Executable-section <br>  [exception-section] <br>END [procedure-name]; <br>参数说明 <br>      IN      参数的值传递给过程或函数,但是没有返回给调用它的PL/SQL子程序。在<br>一个过程或函数内部,您不能给说明为IN的参数赋值,只能引用这种类型参数的值。 <br>      OUT    过程或函数不能使用参数传递的值,但给调用它的PL/SQL子程序一个返回<br>值。在一个过程或函数内部,您不能用引用说明为OUT的参数值,只能给这种类型参数赋值<br>。 <br>      IN OUT  参数的值传递给过程或函数,并且给调用它的PL/SQL子程序一个返回值。<br>如果说明一个参数为IN OUT类型,则在过程或函数内部,既可引用这种类型参数的值又可<br>给其赋值。 <br><br>函数说明: <br>    一个PL/SQL函数说明与过程说明很相——只是函数返回一个预定义的数据类型的值。<br>说明一个函数的语法如下: <br>FUNCTION function-name  [(argument1 [,argumentN]) <br>  RETURN  function-datatype IS <br>    [local-variable-decarations] <br>  BEGIN <br>    Executable-section <br>    [exception-section] <br>  END [function-name]; <br><br>二.使用存储过程或函数 <br>存储过程或函数是存储在Oracle数据库中的PL/SQL程序,可由 <br><br> <div></div> </div> <p style="clear:both;"></p> <p class="translate"> 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25897606/viewspace-704152/,如需转载,请注明出处,否则将追究法律责任。 </p> </div> </div> <div class="preview-footer clearfix"> <!--已点赞、收藏--> <div class="icon-praise" id="praise" onclick="blogObj.praise($(this),'/praise/')"><span class="text"></span><span class="num">0</span></div> <div class="icon-collect" id="collect" onclick="blogObj.praise($(this),'/favour/')"><span class="text"></span><span class="num">0</span></div> <div class="share-group fr"> <div class="bdsharebuttonbox bdshare-button-style0-16" data-bd-bind="1522216707615"> <span class="fl">分享到:</span> <a href="javascript:;" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a> <a href="javascript:;" class="bds_sqq" data-cmd="sqq" title="分享到QQ好友"></a> <a href="javascript:;" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a> <a href="javascript:;" class="bds_weixin" data-cmd="weixin" title="分享到微信"></a> </div> <script> window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdDesc": "", "bdMini": "", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "32" }, "share": {"bdSize": 16} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)]; if ($(window).width() < 1320) { if ($(window).width() < 1200) { $(".sideslip").css({ "left": "20px", "margin-left": 0 }) } else { $(".sideslip").css({ "margin-left": "-590px" }) } }</script> </div> </div> <div class="article-context"> <div class="fl"> <span class="color77">上一篇:</span> <a href="http://blog.itpub.net/25897606/viewspace-704151/">Oracle之 数据块、区段和段</a> </div> <div class="fr"> <span class="color77">下一篇:</span> <a href="http://blog.itpub.net/25897606/viewspace-704153/">Javascript 闭包——摘自网络</a> </div> </div> <input type="hidden" id="blogId" value="704152"> <!--评论开始--> <div class="blog-comment"> <div class="new-comment"> <input type="hidden" id="hid" name="hid" value="704152"> <input type="hidden" name="_token" value="3y7105p5ng413GrS3hhJ2v25YRQzeCtAR2Y7Eqy4"> <a class="avatar" href="javascript:;"> <img src="http://blog.itpub.net/images/user_pic_default.png"></a> <!--用户未登录--> <div class="sign-container"> <span>请登录后发表评论</span> <a class="btn btn-sign"> <a class="layui-btn ml30" onclick="blog.login(event)">登录</a> </a> </div> <!--用户已登录--> <textarea placeholder="请写下你的评论…" onfocus="blogObj.textareaFocus($(this),200)" maxlength=200></textarea> </div> <div class="comment-list"> <div class="top-title"><span class="all-comment">全部评论</span> <span class="colorbb ml20"></span> </div> <div class="comment-items" id="comment_items"> <script type="text/template" id='blog_template'> <%for(var i=0;i <items.length;i++){%> <div class="comment-item"> <div class="author"> <a target="_blank" href="/<%=items[i].uid%>" class="avatar"> <img src="<%=items[i].headimg%>" alt=""> </a> <div class="info"> <div class="name"><a target="_blank" href="/<%=items[i].uid%>"><%=items[i].username%></a> <span class="fr reply-btn" onclick="blogObj.newComment($(this),'<%=items[i].username%>',<%=items[i].id%>)">回复</span></div> <div class="time colorbb"><%=items[i].createtime%></div> </div> </div> <p class="comment-wrap"><%=items[i].content%></p> <%if(items[i].items.items.length) { %> <div class="sub-comment-list"> <%for(var j=0;j<items[i].items.items.length;j++){%> <div class="sub-comment"> <div class="color77 time-reply"> <span class="time"><%=items[i].items.items[j].createtime%></span> <span class="reply-btn fr" onclick="blogObj.newComment($(this),'<%=items[i].items.items[j].username%>',<%=items[i].items.items[j].id%>)">回复</span> </div> <p><a href="/<%=items[i].uid%>"><%=items[i].items.items[j].username%></a>   回复   <a href="/<%=items[i].touid%>"><%=items[i].items.items[j].tousername%></a>: <span class="content"><%=items[i].items.items[j].content%></span></p> </div> <%}%> <%if(items[i].items.total > 5) { %> <div class="more-comment"><span class="sub-comment-count">还有<i class="count"><%=items[i].items.total-5%></i>条评论</span><span class="more-comment-btn" onclick=blogObj.loadSubComment($(this),<%=items[i].id%>) data-count=1 data-flag=true>点击查看</span></div> <%}%> </div> <%}%> </div> <%}%> </script> </div> </div> </div> <!--评论结束--> </div> <script> </script> <div class="fr w290"> <!--作者信息开始--> <!--作者信息开始--> <div class="author-info right-fixed "> <div class="head-img"> <a href="http://blog.itpub.net/25897606/"><img src="http://account.itpub.net/api/avatar.php?uid=25897606" alt=""></a> </div> <div class="author-name"><a href="http://blog.itpub.net/25897606/">ForTechnology</a></div> <div class="author-intro"> </div> <p class="register-time"><span class="color77">注册时间:</span>2011-07-21</p> <ul class="tree-list clearfix"> <li> <div class="item-tt">博文量</div> <a href="http://blog.itpub.net/25897606/"><span class="item-num blognum">220</span></a> </li> <li> <div class="item-tt">访问量</div> <div class="item-num blogviewnum">667498</div> </li> </ul> </div> <!--作者信息结束--> <script> var data = {uid: 25897606}; $._ajax({ url: '/getAuthorInfo/', data: data, type: 'get', dataType: 'json', success: function (data) { if (data.code == 200) { var data = data.data; $(".blognum").text(data.blognum); $(".blogviewnum").text(data.visitednum); } } }); </script> <!--作者信息结束--> <!--博文推荐开始--> <div class="blog-choice right-fixed"> <h3 class="choice-title">最新文章</h3> <ul class="newul"> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-1244614/" class="clearfix"> vim配置及插件安装管理(超级详细) </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-1244602/" class="clearfix"> 配置vim界面--用winmanager合并显示NERDTree和TagList </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-1134893/" class="clearfix"> entity framework sql 优化 </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-1103704/" class="clearfix"> Asp.Net页面生命周期 </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-768085/" class="clearfix"> mvc textboxfor name 属性 </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-768084/" class="clearfix"> mvc 客户端 验证 失效 没有 form 标签 </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-768083/" class="clearfix"> Model Template与Html.Editor的实现 </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-768082/" class="clearfix"> ModelBinder </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-768081/" class="clearfix"> MVC 绑定 集合类型 model </a> </li> <li class="new-item"> <a href="http://blog.itpub.net/25897606/viewspace-764254/" class="clearfix"> .net 后台 发送http请求 </a> </li> <ul> </div> <!--大牛精选结束--> </div> </div> <div class="icon-back-top" onclick="$('html,body').animate({scrollTop:0},'slow');"></div> <!--main部分结束--> <!--百度推送--> <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> <!--2020-11-28 18:49:11--> <!--footer部分开始--> <div class="blog-footer"> <div class="w1200 pr"> <div class="footer-links"> <a class="icon-blog icon-wx mr30"> <div class="wx-qrcode"> <img src="http://edu.itpub.net/images/qrcode.jpg" alt=""> </div> </a> <a href="https://weibo.com/itpub2001?from=myfollow_all" class="icon-blog icon-wb" target="_blank"></a> </div> <p class="footer-nav"> <a href="http://www.it168.com/bottomfile/it168.shtml" target="_blank">支持我们</a> <a href="http://www.it168.com/bottomfile/tgzn.shtml" target="_blank">作者招募</a> <a href="http://www.it168.com/bottomfile/sytk.shtml" target="_blank">用户协议</a> <a href="http://blog.itpub.net/31509949/viewspace-2157750/" target="_blank">FAQ</a> <a href="http://edu.itpub.net/contactus.html" target="_blank">Contact Us</a> <script src="https://s22.cnzz.com/z_stat.php?id=1274521965&web_id=1274521965" language="JavaScript"></script> </p> <p>北京盛拓优讯信息技术有限公司. 版权所有  <a style="color:#777777;" target="_blank" href="http://beian.miit.gov.cn">京ICP备09055130号-4</a>  北京市公安局海淀分局网监中心备案编号:11010802021510</p> <p>广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员</p> </div> </div> <!--footer部分结束--> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?5016281862f595e78ffa42f085ea0f49"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <!-- END STAT PV --> </body> </html>