`

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行.

分享到:
评论

相关推荐

    Oracle SQL*Plus Pocket Reference, 2nd Edition

    ### Oracle SQL*Plus 口袋...以上章节覆盖了《Oracle SQL*Plus Pocket Reference, 2nd Edition》的主要内容,为读者提供了丰富的SQL*Plus使用技巧和最佳实践,适合各种级别的Oracle数据库管理员和技术人员学习和参考。

    SQL*PLUS命令的使用大全

    本文将深入探讨SQL*PLUS命令的使用,包括基础操作、高级技巧以及实用的命令。 一、SQL*PLUS基础操作 1. 登录与退出 - 登录:`sqlplus username/password@database` - 退出:`quit` 或 `exit` 2. 显示帮助 - `...

    SQL*Plus Quick Reference Release 9.2

    13. **其他**:可能包括一些不常见的特性和技巧,或者特定的Oracle特性介绍。 最后,文档强调了Oracle是注册商标,Oracle9i、SQL*Plus和iSQL*Plus是Oracle公司的商标或注册商标,而其他名称可能是其各自所有者的...

    SQL*Plus之命令使用大集合.pdf

    ### SQL*Plus命令使用详解 #### 一、执行SQL脚本文件 - **命令**: `@脚本文件路径` - **功能**: 直接在SQL*Plus环境中执行指定路径下的SQL脚本文件。 - **示例**: `@C:\scripts\my_script.sql` #### 二、对当前...

    SQL*Plus User's Guide and Reference Release 11.2-430

    10. **性能优化**:涉及SQL查询的性能调优技巧,如使用绑定变量、分析SQL语句、优化查询计划等。 11. **与其他Oracle工具的集成**:简述如何将SQL*Plus与其他Oracle管理工具,如SQL Developer,集成使用。 12. **...

    SQL_PLUS.rar_PLUS SQL_SQL_Plus_plus_sql plus

    在提供的压缩文件中,"www.pudn.com.txt"可能包含了一些关于SQL Plus的使用技巧或者资源链接,"SQLPLUS说明.txt"很可能是官方或非官方的SQL Plus使用手册,提供了详细的使用指南和帮助信息。而"src"目录可能包含了...

    Oracle.SQL.Plus.Pocket.Reference

    #### 三、命令行 SQL\*Plus 使用技巧 - **启动 SQL\*Plus**:启动 SQL\*Plus 非常简单,只需在命令行输入 `sqlplus` 命令即可。 - **命令输入**:用户可以在 SQL\*Plus 中直接输入 SQL 查询语句或其他 SQL\*Plus ...

    sql plus user's guide and reference release 11.2

    3. **实用技巧**:提高工作效率的小贴士,如自定义设置、快捷键使用等。 4. **案例研究**:通过具体实例来演示如何利用SQL*Plus解决实际问题。 5. **故障排除**:常见问题及解决方法。 #### 四、SQL*Plus基本概念 ...

    SQL*8PLUS在军队医疗卡审核中的应用.pdf

    运用SQL*PLUS等数据库技术进行数据审核能够显著提升工作效率和准确性,而熟练掌握各种数据库的使用技巧是确保医疗纠纷举证成功的关键。 在阅读了以上内容后,我们可以总结出以下知识点: 1. SQL*PLUS的应用:SQL*...

    sql_plus

    熟练掌握`sql*plus`的使用技巧,对于任何Oracle数据库开发者或管理员来说,都是提升工作效率和数据管理能力的关键。通过对SQL语句与SQL*Plus命令的区分理解,以及常用命令的具体应用,用户可以更加高效地进行数据库...

    sql.plus命令大全

    本文将详细介绍一些常用的SQL*PLUS命令,帮助你更好地理解和掌握数据库操作。 1. **执行SQL脚本文件**: 在SQL*PLUS中,可以使用`start`或`@`命令来执行存储在文本文件中的SQL脚本。例如,如果有一个名为`script....

    数据库SQL*splus命令大全

    ### 数据库 SQL\*plus 命令大全 在 IT 领域中,SQL\*plus 是一个非常实用的工具,尤其对于那些刚开始接触数据库管理的初学者来说更是如此。本文将根据提供的标题、描述及部分内容,详细介绍 SQL\*plus 的主要功能...

    Oracle官方文档中文版-SQLPlus快速参考

    Oracle SQL*Plus是一款强大的命令行工具,用于与Oracle数据库交互,执行SQL查询、PL/SQL块以及管理数据库任务。这份“Oracle官方文档中文版-SQLPlus快速参考”提供了全面的SQL*Plus命令指南,帮助用户高效地操作...

    SQL_Plus使用手册

    ### SQL Plus使用手册知识点概述 #### 一、SQL Plus简介 - **定义**:SQL Plus是Oracle提供的一款功能强大的命令行工具,用于管理和操作Oracle数据库。它不仅支持SQL语句的执行,还提供了多种增强功能,如脚本执行...

    Pro Oracle SQL-成为SQL语言编写专家

    为了更好地理解和实践SQL命令,本书还介绍了Oracle SQL*Plus工具的使用方法。SQL*Plus是Oracle提供的一个标准工具,允许用户执行SQL命令并查看结果。主要特点包括: - **基本操作**:介绍如何启动SQL*Plus、连接到...

    SQL语言中文学习资料(PDF)

    - **从命令行**:使用`sqlplus [username[/password[@database]]]`命令登录到SQL*Plus。其中`username`和`password`分别是指定的用户名和密码,`database`是指定的目标数据库。 #### 查看表结构 - 使用`DESC[RIBE] ...

    Oracle - SQLplus

    在本文中,我们将深入探讨Oracle SQL*Plus的一些核心功能和使用技巧。 1. **连接数据库** 使用SQL*Plus,用户可以通过输入`CONNECT`命令来连接到Oracle数据库实例。基本语法如下: ``` CONNECT username/...

Global site tag (gtag.js) - Google Analytics