添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

转自http://baike.baidu.com/view/1239908.htm

Sql*plus是一个最常用的工具,具有很强的功能,主要有:

1. 数据库的维护,如启动,关闭等,这一般在服务器上操作。
2. 执行sql语句执行pl/sql。
3. 执行sql脚本。
4. 数据的导出,报表。
5. 应用程序开发、测试sql/plsql。
6. 生成新的sql脚本。
7. 供应用程序调用,如安装程序中进行脚本的安装。
8. 用户管理及权限维护等。

二、下面就介绍一下一些常用的sql*plus命令:
1. 执行一个SQL脚本文件
SQL>start file_name
SQL>@ file_name
我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。
@与@@的区别是什么?
@等于start命令,用来运行一个sql脚本文件。
@命令调用当前目录下的,或指定全路径,或可以通过SQLPATH环境变量搜寻到的脚本文件。该命令使用是一般要指定要执行的文件的全路径,否则从缺省路径(可用SQLPATH变量指定)下读取指定的文件。
@@用在sql脚本文件中,用来说明用@@执行的sql脚本文件与@@所在的文件在同一目录下,而不用指定要执行sql脚本文件的全路径,也不是从SQLPATH环境变量指定的路径中寻找sql脚本文件,该命令一般用在脚本文件中。
如:在c:\temp目录下有文件start.sql和nest_start.sql,start.sql脚本文件的内容为:
@@nest_start.sql - - 相当于@ c:\temp\nest_start.sql
则我们在sql*plus中,这样执行:
SQL> @ c:\temp\start.sql

附注:也可以在shell中运行,例如sqlplus '/as sysdba' @C:\temp\start.sql

2. 对当前的输入进行编辑
SQL>edit
3. 重新运行上一次运行的sql语句
SQL>/
4. 将显示的内容输出到指定文件
SQL> SPOOL file_name
在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。
5. 关闭spool输出
SQL> SPOOL OFF
只有关闭spool输出,才会在输出文件中看到输出的内容。
6.显示一个表的结构
SQL> desc table_name

1). 设置当前session是否对修改的数据进行自动提交("[ ...]"表示可省略)
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}

2).在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句
SQL> SET ECHO {ON|OFF}

3).是否显示当前sql语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ,则不管查询到多少行都返回。当为off 时,一律不显示查询的行数

4).是否显示列标题
SQL> SET HEA[DING] {ON|OFF}
当set heading off 时,在每页的上面不显示列标题,而是以空白行代替

5).设置一行可以容纳的字符数
SQL> SET LIN[ESIZE] {80|n}
如果一行的输出内容大于设置的一行可容纳的字符数,则折行显示。

6).设置页与页之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 时,会在每页的开头有一个小的黑方框。
当set newpage n 时,会在页和页之间隔着n个空行。
当set newpage none 时,会在页和页之间没有任何间隔。

7).显示时,用text值代替NULL值
SQL> SET NULL text

8).设置一页有多少行数
SQL> SET PAGES[IZE] {24|n}
如果设为0,则所有的输出内容为一页并且不显示列标题

9).是否显示用DBMS_OUTPUT.PUT_LINE包进行输出的信息。
SQL> SET SERVEROUT[PUT] {ON|OFF}
在编写存储过程时,我们有时会用dbms_output.put_line将必要的信息输出,以便对存储过程进行调试,只有将serveroutput变量设为on后,信息才能显示在屏幕上。

10).当SQL语句的长度大于LINESIZE时,是否在显示时截取SQL语句。
SQL> SET WRA[P] {ON|OFF}
当输出的行的长度大于设置的行的长度时(用set linesize n命令设置),当set wrap on时,输出行的多于的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。(默认为on状态)

11).是否在屏幕上显示输出的内容,主要用与SPOOL结合使用。
SQL> SET TERM[OUT] {ON|OFF}
在用spool命令将一个大表中的内容输出到一个文件中时,将内容输出在屏幕上会耗费大量的时间,设置set termspool off后,则输出的内容只会保存在输出文件中,不会显示在屏幕上,极大的提高了spool的速度。

12).将SPOOL输出中每行后面多余的空格去掉
SQL> SET TRIMS[OUT] {ON|OFF}

13)显示每个sql语句花费的执行时间
set TIMING {ON|OFF}

14). 遇到空行时不认为语句已经结束,从后续行接着读入。
SET SQLBLANKLINES ON
Sql*plus中, 不允许sql语句中间有空行, 这在从其它地方拷贝脚本到sql*plus中执行时很麻烦. 比如下面的脚本:
select deptno, empno, ename
from emp
where empno = '7788';
如果拷贝到sql*plus中执行, 就会出现错误。这个命令可以解决该问题

15).设置DBMS_OUTPUT的输出(只是用来在终端输出用)
SET SERVEROUTPUT ON BUFFER 20000
用dbms_output.put_line('strin_content');可以在存储过程中输出信息,对存储过程进行调试
如果想让dbms_output.put_line(' abc');的输出显示为:
SQL> abc,而不是SQL>abc,则在SET SERVEROUTPUT ON后加format wrapped参数。

16). 输出的数据为html格式
set markup html
在8.1.7版本(也许是816? 不太确定)以后, sql*plus中有一个set markup html的命令, 可以将sql*plus的输出以html格式展现.
注意其中的spool on, 当在屏幕上输出的时候, 我们看不出与不加spool on有什么区别, 但是当我们使用spool filename 输出到文件的时候, 会看到spool文件中出现了等tag.

3.修改页面显示和行的默认值

但是这种方法,在你下次进入Sql Plus的时候还要重新设定,很麻烦。所以可以修改默认设置。

在Oracle的安装目录下找到 glogin.sql,

我安装的是Oracle 11,这个文件在D:\oracle\product\11.2.0\dbhome_1\sqlplus\admin下,用搜索很容易找到。然后打开这个文件,

-- NAME

--   glogin.sql

-- DESCRIPTION

--   SQL*Plus global login "site profile" file

--   Add any SQL*Plus commands here that are to be executed when a

--   user starts SQL*Plus, or uses the SQL*Plus CONNECT command.

set linesize 300 ;

set pagesize 100 ;

更多详细内容参见:http://blog.csdn.net/kkdelta/article/details/7178890

4.对于clob和blob以及to_char和to_clob之间的讨论

(1)clob和blob介绍

  • BLOB全称为二进制大型对象(Binary Large Object)。它用于存储数据库中的大型二进制对象。可存储的最大大小为4G字节
  • CLOB CLOB全称为字符大型对象(Character Large Object)。它与LONG数据类型类似,只不过CLOB用于存储数据库中的大型单字节字符数据块,不支持宽度不等的字符集。可存储的最大大小为4G字节。
  • NCLOB 基于国家语言字符集的NCLOB数据类型用于存储数据库中的固定宽度单字节或多字节字符的大型数据块,不支持宽度不等的字符集。可存储的最大大小为4G字节
  • BFILE 当大型二进制对象的大小大与4G字节时,BFILE数据类型用于将其存储在数据库外的操作系统文件中;当其大小不足4G字节时,则将其存储在数据库内部的操作系统文件中,BFILE列存储文件定位程序,此定位程序指向服务器上的大型二进制文件。
  • 总结就是:Blob是存大对象类型(一般是文件 图片,office文件等.) Clob是存大文本/长字符串
  • (2)实际项目中遇到的问题

    在sqlplus中查询clob类型的数据默认是不能显示全的,默认一行显示80个字符(多的会切割掉),不管是否设置set linesize 什么的,这是对clob的限制,例如:

    select sql_fulltext from v$sql;就会发现每行只能显示80个字符。

    有几种办法显示全:

    方法一:select dbms_lob.substr(sql_fulltext) from  v$sql;

    #注意,这样虽然显示全了,但是在后面还是会出问题,虽然这次不切割了,会在最后提示错误:ERROR: ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小
    ORA-06512: 在 line 1

    所以实际上没有解决。哈哈哈哈

    方法二:其实是可以设置参数解决上面的错误

    SQLPLUS输出CLOB类型的数据时经常会碰到数据被截断从而无法完全输出的问题,其实这些都是因为sqlplus参数设置的原因,本文将对几个主要的参数进行讨论。

    1、set long 2000000000

    首先是long参数,该参数的最大值是2000000000(2G),单位是字节。含义是:Sets maximum width (in bytes) for displaying CLOB, LONG, NCLOB and XMLType values; and for copying LONG values.中文含义大概是设置CLOB、LONG、NLOB和XMLType类型的最大显示字节数。

    2、set longchunksize 255

    与long参数相关的是longchunksize参数,该参数的值应该比long参数的值要小,单位也是字节。含义是:Sets the size (in bytes) of the increments SQL*Plus uses to retrieve a CLOB, LONG, NCLOB or XMLType value.即sqlplus会按照这个参数的值来一段一段的获取上述类型的数据,直到达到long的值或者数据获取完毕。

    数据有10个字节:0123456789

    如果set longchunksize 2,那么显示出来的效果就是

    如果set longchunksize 4,那么显示出来的效果就是

    3、set linesize 255

    这个参数用的很频繁,相信含义大家也都知道:Sets the total number of characters that SQL*Plus displays on one line before beginning a new line.这个参数是用来控制sqlplus显示的,而longchunksize是用来控制sqlplus获取数据的,所以如果这个参数设置不当也不能完全显示。

    数据有10个字节:0123456789

    set longchunksize 4

    set linesize 3

    显示效果如下

    012  --3无法显示

    456  --7无法显示

    所以想正确显示select sql_fulltext from v$sql; 的方法就是设置set long 2000000000,真的最大2G,换其他的还真不行,嘻嘻。set longchunksize 255。

    然后就可以正常查询了,注意不要用 dbms_lob.substr了哦,直接select sql_fulltext from v$sql;就可以啦

    方法三:编写程序(反正我是没看懂)

    给你一个我写的读lob的plsql作为参考:
    create or replace procedure haozhu_getblob(
    table_name in varchar2,
    field_id in varchar2,
    field_name in varchar2,
    v_id in varchar2,
    v_pos in number
    lobloc clob;
    buffer varchar2(32767);
    amount number := 60;
    offset number := 1;
    query_str varchar2(1000);
    create_str varchar2(1000);
    bloblength number;
    ddlcursor integer;
    begin
    query_str :='select DBMS_LOB.GETLENGTH('||field_name||') from '||table_name||' where '||field_id||'= :id';
    --dbms_output.put_line('query_str is '||query_str);
    EXECUTE IMMEDIATE query_str INTO bloblength USING v_id;
    --dbms_output.put_line('The length of blob is '||bloblength);
    query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id';
    EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
    offset:=offset+(v_pos-1)*amount;
    while (offset<=bloblength) loop
    --dbms_output.put_line('offset: '||offset);
    --read 2000 varchar2 from the buffer
    dbms_lob.read(lobloc,amount,offset,buffer);
    dbms_output.put_line(buffer);
    offset:=offset+amount;
    end loop;

    O(∩_∩)O哈哈~,这篇完,后面还会用到跟clob相关的内容,当时纠结死了