`
skwqy
  • 浏览: 49361 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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.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_table.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)

删除相同的行:
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行
 

分享到:
评论

相关推荐

    SQL语句资料整理ppt实用技巧分享

    通过本章学习,您将可以: 列举 SQL SELECT语句的功能。 执行简单的选择语句。 SQL 语言和 SQL*Plus 命令的不同

    oracle .

    Oracle数据库基础 查询基础 表及索引的定义操作 视图、同义词和序列 簇与分区 复杂查询语句的使用 一些高级的用法 安全管理 其它一些常见问题及技巧 常用技巧 Oracle PL/SQL基础 ...SQL及SQL*PLUS 命令参考 ......

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    ORACEL数据库常用命令(有详细解释)

    3. 使用SQL*PLUS(1) SQL&gt; desc table; 显示表结构 SQL&gt; select * from tab; 查看用户下所有的表 SQL&gt; set pause on; 可以使大量结果集在用户按“Enter”(回车)后翻页 SQL&gt; set pagesize 100; 设定SQL语句返回...

    SQL21日自学通

    在SQL*PLUS 中使用变量453 DEFINE 454 ACCEPT 455 NEW_VALUE457 DUAL 表458 DECODE 函数459 日期转换462 运行一系列的SQL 文件465 在你的SQL 脚本中加入注释466 高级报表467 总结469 问与答469 校练场469 练习470 第...

    oracle 应用教程

    第一部分是ORACLE SQL*PLUS基础,主要讲述ORACLE 应用系统设计的基本知识和给出一些有用的实例;第二部分是介绍ORACLE PL/SQL知识,主要讲述ORACLE...3.给出了许多资料所没有提供的一些使用技巧,如导出触发器等。

    Oracle8i/9i 数据库基础(对想全面了解Oracle的程序员来说真是一本很好的书)

    本书主要包括两个部 分,第一部分是ORACLE SQL*PLUS 基础,主要讲述ORACLE 应用系统设计的基本知识和 给出一些有用的实例;第二部分是介绍ORACLE PL/SQL ...3.给出了许多资料所没有提供的一些使用技巧,如 导出触发器等

    Oracle 数据库实用指南

    本书共四篇59章:第一篇是Oracle SQL*Plus讲述...提供了一些使用技巧和注意事项;给出了许多资料,省去查阅的时间等。总之,本书基本上包括当前Oracle 8i的最新内容,也覆盖了最新的Oracle 8i OCP培训大纲的内容。

    Oracle Database 11g & MySQL 5.6开发手册

    您可以学会如何迁移数据库、移植SQL代码、使用Oracle和MySQL数据库以及配置高效率的查询。在这本内容广泛的书籍中,还包括了安全、监控和调试方面的技巧。 本书特色 ● 理解Oralce Database 11g和MySQL 5.6的架构 ...

    Oracle Database 11g & MySQL 5.6开发手册 中文版.

    您可以学会如何迁移数据库、移植SQL代码、使用Oracle和MySQL数据库以及配置高效率的查询。在这本内容广泛的书籍中,还包括了安全、监控和调试方面的技巧。 《Oracle Database 11g & MySQL 5.6开发手册》特色 理解...

    sql plus

    介绍关系数据库的SQL语言及其在ORACLE中的应用技巧

    sqlplus教程(中文)

    之前的不能用,重新传一个! SQL*PLUS 详细介绍关系数据库的SQL语言及其在ORACLE中的应用技巧。 是学习与复习SQL语句,熟悉ORACLE的好教程。

    Oracle数据库基础.doc

    3.给出了许多资料所没有提供的一些使用技巧,如导出触发器等。总之,内容基本上包括当前Oracle的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,而且...

    Oracle8i_9i数据库基础

    3.给出了许多资料所没有提供的一些使用技巧,如导出触发器等。总之,内容基本上包括当前Oracle8I的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,...

    Oracle_8i_9i数据库基础下载

    3.给出了许多资料所没有提供的一些使用技巧,如导出触发器等。总之,内容基本上包括当前Oracle8I的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,...

    Oracle8i_9i数据库基础.txt

    3.给出了许多资料所没有提供的一些使用技巧,如导出触发器等。总之,内容基本上包括当前Oracle8I的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,...

    ORACLE8i 数据库基础 (初稿) 赵元杰

    3.给出了许多资料所没有提供的一些使用技巧,如导出触发器等。总之,内容基本上包括当前Oracle8I的最新内容。同时也覆盖了最新的ORACLE8i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,...

    数据库基础

    第一部分 Oracle SQL*PLUS基础 23 第一章 Oracle数据库基础 23 §1.1 理解关系数据库系统(RDBMS) 23 §1.1.1 关系模型 23 §1.1.2 Codd十二法则 24 §1.2 关系数据库系统(RDBMS)的组成 24 §1.2.1 RDBMS 内核 24...

    oracle基础教程

    3.给出了许多资料所没有提供的一些使用技巧,如导出触发器等。总之,内容基本上包括当前Oracle9i的最新内容。同时也覆盖了最新的ORACLE9i OCP培训大纲的内容。不仅包含ORACLE 程序设计人员、DBA所必须掌握的知识,...

Global site tag (gtag.js) - Google Analytics