Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
sqlplus的小秘密[转]
 
    今天看到一个帖子,学了几个SQLPLUS的小技巧。说实话还挺不错的,确实没有花时间看过Oracle关于SQLPLUS的文档,总觉得有点浪费时间,呵呵,不过这样知识就永远掌握得不牢靠,忘记了要去查,不过要能抽出时间看这种文档,估计要等1-2年之后了。
    转载自: http://www.itpub.net/viewthread.php?tid=424236&extra=page%3D1%26amp%3Bfilter%3Ddigest
 
 
 
1、显示空格
 
有没有为了dbms_output.put_line会"吃掉"最前面的空格而苦恼?
 
SQL> set serveroutput on
SQL> exec dbms_output.put_line('   abc');
abc
 
PL/SQL procedure successfully completed.
 
 
(俺以前曾经很苦恼为了保留空格, 尝试了加".", 加不可见字符等办法, 不过终究觉得不自然)
实际上, 只要在set serveroutput on后加上format wrapped参数, 就可以避免这个问题
 
SQL> set serveroutput on format wrapped
SQL> exec dbms_output.put_line('   abc');
   abc
 
PL/SQL procedure successfully completed.
 
 
 
2、SQL语句中的空行
 
Sql*plus中, 不允许sql语句中间有空行, 这在从其它地方拷贝脚本到sql*plus中执行时很麻烦. 比如下面的脚本:
 
select deptno, empno, ename
from emp
 
where empno = '7788';
如果拷贝到sql*plus中执行, 就会出现错误:
 

SQL> select deptno, empno, ename
  2  from emp
  3
SQL> where empno = '7788';
SP2-0734: unknown command beginning "where empn..." - rest of line ignored.
 
原因是sqlplus遇到空行就认为是语句结束了.
其实要改变这种现象, 只要使用SQLBLANKLINES参数就可以了.
 
SQL> SET SQLBLANKLINES ON
SQL>
select deptno, empno, ename
  2  from emp
  3
  4  where empno = '7788';
 
    DEPTNO      EMPNO ENAME
---------- ---------- ----------
        20       7788 SCOTT
 
 
 
3、 # 的应用
 
 
    有没有过这样的经历? 在sql*plus中敲了很长的命令后, 突然发现想不起某个列的名字了, 如果取消当前的命令,待查询后再重敲, 那太痛苦了. 当然你可以另开一个sql*plus窗口进行查询, 但这里提供的方法更简单。这种情况下, 只要在下一行以#开头, 就可以执行一条sql*plus命令, 执行完后, 刚才的语句可以继续输入
 

SQL> select deptno,
  2  empno,
  3  ename
  4  from emp
  5  where
  6  #desc emp
Name                                      Null?    Type
----------------------------------------- -------- --------------
 
EMPNO                                     NOT NULL NUMBER(4)
ENAME                                              VARCHAR2(10)
JOB                                                VARCHAR2(9)
MGR                                                NUMBER(4)
HIREDATE                                           DATE
SAL                                                NUMBER(7,2)
COMM                                               NUMBER(7,2)
DEPTNO                                             NUMBER(2)
 
  6  sal > 4000;
 
    DEPTNO      EMPNO ENAME
---------- ---------- ----------
        10       7839 KING
 
 
 
 
4、以html格式展现输出

 
sql*plus中有一个set markup html的命令, 可以将sql*plus的输出以html格式展现
 

SQL> set markup html on spool on
SQL&gt; select empno, ename from emp where rownum<3;

<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
EMPNO
</th>
<th scope="col">
ENAME
</th>
</tr>
<tr>
<td align="right">
7369
</td>
<td>
SMITH
</td>
</tr>
<tr>
<td align="right">
7499
</td>
<td>
ALLEN
</td>
</tr>
</table>
<p>
 
SQL&gt;

注意其中的spool on, 当在屏幕上输出的时候, 我们看不出与不加spool on有什么区别, 但是当我们使用spool filename 输出到文件的时候, 会看到spool文件中出现了<html><body>等tag.
 
SQL&gt; spool c:\emp.htm
<br>
SQL&gt; /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
... ...
 
SQL&gt; spool off
<br>

查看生成的emp.htm文件的内容:
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=WINDOWS-936">
<meta name="generator" content="SQL*Plus 9.2.0">
<style type='text/css'> body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} p {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} table,tr,td {font:10pt Arial,Helvetica,sans-serif; color:Black; background:#f7f7e7; padding:0px 0px 0px 0px; margin:0px 0px 0px 0px;} th {font:bold 10pt Arial,Helvetica,sans-serif; color:#336699; background:#cccc99; padding:0px 0px 0px 0px;} h1 {font:16pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; border-bottom:1px solid #cccc99; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px;} h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif; color:#663300; background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;}</style><title>SQL*Plus Report</title>
</head>
<body>
SQL&gt; /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
EMPNO
</th>
<th scope="col">
ENAME
</th>
</tr>
<tr>
<td align="right">
7369
</td>
<td>
SMITH
</td>
</tr>
<tr>
<td align="right">
7499
</td>
<td>
ALLEN
</td>
</tr>
</table>
<p>
 
SQL&gt; spool off
<br>
</body>
</html>
 
用ie打开emp.htm文件后的样式如下:
 
  sqlplus
 
 
现在看看spool off的情况下:
 
SQL&gt; set markup html on spool off
<br>
SQL&gt; spool c:\emp2.htm
<br>
SQL&gt; /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script outpu
... ...
SQL&gt; spool off
<br>
 
查看生成的emp2.htm文件的内容:
 
SQL&gt; /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
EMPNO
</th>
<th scope="col">
ENAME
</th>
</tr>
<tr>
<td align="right">
7369
</td>
<td>
SMITH
</td>
</tr>
<tr>
<td align="right">
7499
</td>
<td>
ALLEN
</td>
</tr>
</table>
<p>
 
SQL&gt; spool off
 
由于这段代码中没有html文件头, 所以我们可以直接作为内容插入到网页中

总结: 如果要生成一个完整的html文件, 就使用spool on选项, 如果只是要内容部分(用来添加到一个现有的网页中), 那么就使用spool off选项.
 
另外, set markup html还有很多选项可以用来定制生成的html的各个部分, 例如head, body, table等, 这里不再逐一说明, 详细信息可以参考SQL*Plus User's Guide and Reference.
 
适用场景: 当需要定时更新一个从数据库中获取内容的静态页面时, 这种方法绝对是快捷的并且容易实现的.
posted on 2008-12-30 20:01 decode360 阅读(390) 评论(0)  编辑  收藏 所属分类: 05.SQL

只有注册用户登录后才能发表评论。


网站导航: