sql*plus使用的一些技巧sql*plus中蕴藏着好多技巧,假如掌控这些技巧,对于在oracle数据库下进行快速研发和有效维护数据库都是有益的。        下面就接受一二,        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.sqlc. 在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 offset feedback offset newpage noneset pagesize 5000set linesize 500set verify offset pagesize 0set term offset trims onset linesize 600set heading  off set timing offset verify offset numwidth 38spool  c:\drop_table.sql      select drop table || table_name ||; from user_tables;      spool off b. 以scott用户登录数据库sqlplus > @ …..\gen_dorp_table.sqlc. 在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_table.sql文档,删除scott用户下任何的表。sqlplus > @ c:\dorp_table.sql2.将一个表中的数据导出生成一个文本文档,列和列之间以”,”隔开set echo offset feedback offset newpage noneset pagesize 5000set linesize 500set verify offset pagesize 0set term offset trims onset linesize 600set heading  off set timing offset verify offset numwidth 38spool  c:\drop_table.sql      select deptno || , || dname from dept;     spool off 将上面的内容保存为一个文本文档后,以scott登录,执行该文档后显示结果:10,accounting  20,research  30,sales  40,operations  通过上面的两个例子,我们能够将:set echo offset feedback offset newpage noneset pagesize 5000set linesize 500set verify offset pagesize 0set term offset trims onset linesize 600set heading  off set timing offset verify offset numwidth 38spool  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            ,bb3.动态生成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.txt5.如何指定缺省的编辑脚本的目录        在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)删除相同的行:delete from dept awhere 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 cripts;c:\myscripts9.@和@@的区别是什么?@等于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行.

转此:http://www.cnoug.org/viewthread.php?tid=31451