网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  从多个方面详细讲解sqlplus的使用技巧 (1)     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:59次  录入:管理员--2008-03-04  
 

本文从多个方面讲述了sqlplus技巧。

style="text-indent:2em">1.使用sql*plus动态生成批量脚本

将spool与select命令结合起来使用,可以生成一个脚本脚本中包含有可以批量执行某一任务的语句。

例1:生成一个脚本,删除scott用户下的所有的表:

a. 创建gen_drop_table.sql文件,包含如下语句:

spool c:\drop_table.sql 
select 'drop table '|| 
table_name ||';' from user_tables; 
spool off

b. 以scott用户登录数据库:

sqlplus > @ …..\gen_dorp_table.sql

c. 在c盘根目录下会生成文件drop_table.sql文件,包含删除所有表的语句,如下所示:

sql>select 'drop table '|| table_name ||';' from user_tables;         
                                                      
'droptable'||table_name||';'                   
----------------------------- 
drop table dept;                           
drop table emp;                           
drop table parent;                         
drop table stat_vender_temp;               
drop table table_forum;                                                    
5 rows selected:sql> spool off。

d. 对生成的drop_table.sql文件进行编辑去掉不必要的部分,只留下drop table …语句

e. 在scott用户下运行dorp_table.sql文件,删除scott用户下所有的表。sqlplus > @ c:\dorp_table.sql。

在上面的操作中,在生成的脚本文件中会有多余的字符,如运行的sql语句,标题,或返回的行数,需要我们编辑该脚本后再运行,给实际的操作带来诸多不便。懒惰是人的本性,这促使我们用更简单的办法来实现上面的任务。

a. 创建gen_drop_table.sql文件,包含如下语句:

set echo off
set feedback off
set newpage none
set pagesize 5000
set linesize 500
set verify off
set pagesize 0
set term off
set trims on
set linesize 600
set heading off 
set timing off
set verify off
set numwidth 38
spool c:\drop_table.sql 
select 'drop table '|| table_name ||';' from user_tables; 
spool off

b. 以scott用户登录数据库:sqlplus > @ …..\gen_dorp_table.sql。

c. 在c盘根目录下会生成文件drop_table.sql文件,包含删除所有表的语句,如下所示:

drop table dept;                           
drop table emp;                           
drop table parent;                         
drop table stat_vender_temp;               
drop table table_forum;

d. 在scott用户下运行dorp_t:

able.sql文件,删除scott用户下所有的表。sqlplus > @ c:\dorp_table.sql

2.将一个表中的数据导出生成一个文本文件,列与列之间以”,”隔开:

set echo off
set feedback off
set newpage none
set pagesize 5000
set linesize 500
set verify off
set pagesize 0
set term off
set trims on
set linesize 600
set heading off 
set timing off
set verify off
set numwidth 38
spool c:\drop_table.sql 
select deptno || ',' || dname from dept;
spool off

将上面的内容保存为一个文本文件后,以scott登录,执行该文件后显示结果:

10,accounting 
20,research 
30,sales 
40,operations

通过上面的两个例子,我们可以将:

set echo off
set feedback off
set newpage none
set pagesize 5000
set linesize 500
set verify off
set pagesize 0
set term off
set trims on
set linesize 600
set heading off 
set timing off
set verify off
set numwidth 38
spool c:\具体的文件名

你要运行的sql语句spool off。

作为一个模版,只要将必要的语句假如这个模版就可以了。

在oracle的较新版本中,还可以用set colsep命令来实现上面的功能:

sql> set colsep ,
sql> select * from dept;
    10,accounting   ,new york
    20,research     ,dallas
    30,sales       ,chicago
    40,operations   ,boston
    35,aa         ,bb

3.动态生成spool命令所需的文件名。

在我们上面的例子中,spool命令所需要的文件名都是固定的。有时我们需要每天spool一次,并且每次spool的文件名都不相同,如文件名包含当天的日期,该如何实现呢?

column dat1 new_value filename;
select to_char(sysdate,'yyyymmddhh24mi') dat1 from dual; 
spool c:\&&filename..txt 
select * from dept;
spool off;

4.如何从脚本文件中得到windows环境变量的值:

在windos中:

spool c:\temp\%oracle_sid%.txt 
select * from dept; 
... 
spool off

在上面的例子中,通过%oracle_sid%的方式引用环境变量oracle_sid的值,如果oracle_sid的值为orcl,则生成的spool文件名为:orcl.txt。

在unix中:

spool c:\temp\$oracle_sid.txt 
select * from dept; 
... 
spool off

在上面的例子中,通过$oracle_sid的方式引用环境变量oracle_sid的值,如果oracle_sid的值为orcl,则生成的spool文件名为:orcl.txt。

5.如何指定缺省的编辑脚本的目录:

在sql*plus中,可以用save命令,将上一条执行的sql语句保存到一个文件中,但是如何设置该文件的缺省目录呢?

通过sql> set editfile c:\temp\file.sql 命令,可以设置其缺省目录为c:\tmpe,缺省文件名为file.sql。

6.如何除去表中相同的行:

找到相同的行:

select * from dept a   
where rowid <> (select max(rowid)
from dept b
where a.deptno = b.deptno
and a.dname = b.dname 
-- make sure all columns are compared
and a.loc = b.loc);

注释:

如果只找deptno列相同的行,上面的查询可以改为:

select * from dept a   
where rowid <> (select max(rowid)
            from dept b
            where a.deptno = b.deptno)
<b>删除相同的行:</b>
delete from dept a
where rowid <> (select max(rowid
from dept b
where a.deptno = b.deptno
and a.dname = b.dname 
-- make sure all columns are compared
and a.loc = b.loc);

注意:上面并不删除列值为null的行。

7.如何向数据库中插入两个单引号(’’):insert inot dept values(35,’aa’’’’bb’,’a’’b’);。在插入时,用两个’表示一个’。

8.如何设置sql*plus的搜寻路径,这样在用@命令时,就不用输入文件的全路径。

设置sqlpath环境变量。如:sqlpath = c:\orant\dbs;c:\apps\scripts;c:\myscripts

9.@与@@的区别是什么?

@等于start命令,用来运行一个sql脚本文件。

@命令调用当前目录下的,或指定全路径,或可以通过sqlpath环境变量搜寻到的脚本文件。

@@用在脚本文件中,用来指定用@@执行的文件与@@所在的文件在同一目录,而不用指定全路径,也不从sqlpath环境变量指定的路径中寻找文件,该命令一般用在嵌套脚本文件中。

10.&与&&的区别

&用来创建一个临时变量,每当遇到这个临时变量时,都会提示你输入一个值。

&&用来创建一个持久变量,就像用用define命令或带new_vlaue字句的column命令创建的持久变量一样。当用&&命令引用这个变量时,不会每次遇到该变量就提示用户键入值,而只是在第一次遇到时提示一次。

如,将下面三行语句存为一个脚本文件,运行该脚本文件,会提示三次,让输入deptnoval的值:

select count(*) from emp 
where deptno = &deptnoval;
select count(*) from emp 
where deptno = &deptnoval;
select count(*) from emp 
where deptno = &deptnoval;

将下面三行语句存为一个脚本文件,运行该脚本文件,则只会提示一次,让输入deptnoval的值:

select count(*) from emp 
where deptno = &deptnoval;
select count(*) from emp 
where deptno = &deptnoval;
select count(*) from emp 
where deptno = &deptnoval;

11.引入copy的目的:

copy命令在两个数据库之间拷贝数据时特别有用,特别是该命令可以在两个数据库之间传递long型字段的数据。

缺点:

在两个数据库之间传递数据时,有可能丢失精度(lose precision)。

12.问什么在修改大量的行时,我的脚本会变得很慢?

当通过pl/sql块修改一个表中的许多行时,你会创建在表上创建一个cursor,但是只有在你关闭cursor时,才会释放rollback segment,这样,当cursor仍然打开时,修改过程会变慢,这是因为数据库不得不搜寻大量的rollback segment以便于维护读一致性。为了避免这样情况,试着在表上加一个标志字段来描述该行是否已经被修改,然后关闭该cursor,然后再打开该cursor。每次可以修改5000行。

 
 
上一篇: oracle的window服务启动时并不启动实例    下一篇: 数据库应用系统的开发具体分为哪几个阶段 (1)
  相关文档
利用Oracle管理服务器将数据导入导出 04-11
快速解决"oracle"数据库中的常见问题 (1) 03-17
更改oracle用户名及外部用户验证的授权问题 02-28
讲解sql server定时作业job的设置方法 07-28
多方面讲解pl/sql编程存在的几个缺点 (1) 04-16
深入讲解如何保证和加强数据库的安全性 (1) 02-20
statspack中的library hit是如何计算的 03-06
Oracle 10g中用FORALL处理非连续数组 04-23
Oracle数据库的空间管理技巧 01-15
备份集目录发生改变时应当如何进行恢复 03-05
进行logmnr操作时发现空列名的具体原因 02-27
三步教会你掌握oracle外表(external table) 08-18
详细讲解oracle表分区的相关概念及其优点 (1) 03-17
“顺序事务”与“只读事务”的实际应用 03-06
不通过"lower"等函数查询大小写的内容 02-25
oralce数据库定时执行存储过程的设置步骤 01-31
如何才能解决job的interval输入参数过长 03-24
linux上安装oracle汉字乱码问题的解决方法 08-07
undo表空间暴长后如何才能取消自动扩展 04-18
在不安装oracle客户端的情况下进行系统移植 07-18
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息