Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357013
  • 博文数量: 132
  • 博客积分: 3066
  • 博客等级: 中校
  • 技术积分: 781
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-14 16:19
文章分类

全部博文(132)

文章存档

2012年(1)

2010年(50)

2009年(81)

我的朋友

分类: Oracle

2010-05-19 14:17:15

2008-12-04 | sqlplus的小秘密

分享

有没有为了dbms_output.put_line会"吃掉"最前面的空格而苦恼?

scott@O9I.US.ORACLE.COM> set serveroutput on
scott@O9I.US.ORACLE.COM> exec dbms_output.put_line('   abc');
abc

PL/SQL procedure successfully completed.


(俺以前曾经很苦恼为了保留空格, 尝试了加".", 加不可见字符等办法, 不过终究觉得不自然)
实际上, 只要在set serveroutput on后加上format wrapped参数, 就可以避免这个问题

scott@O9I.US.ORACLE.COM> set serveroutput on format wrapped
scott@O9I.US.ORACLE.COM> exec dbms_output.put_line('   abc');
   abc

PL/SQL procedure successfully completed.

 

 

Sql*plus中, 不允许sql语句中间有空行, 这在从其它地方拷贝脚本到sql*plus中执行时很麻烦. 比如下面的脚本:

select deptno, empno, ename
from emp

where empno = '7788';

如果拷贝到sql*plus中执行, 就会出现错误:


 

scott@O9I.US.ORACLE.COM> select deptno, empno, ename
  2  from emp
  3
where empno = '7788';
SP2-0734: unknown command beginning "where empn..." - rest of line ignored.

原因是sqlplus遇到空行就认为是语句结束了.
其实要改变这种现象, 只要使用SQLBLANKLINES参数就可以了.

scott@O9I.US.ORACLE.COM> SET SQLBLANKLINES ON
scott@O9I.US.ORACLE.COM>
scott@O9I.US.ORACLE.COM> select deptno, empno, ename
  2  from emp
  3
  4  where empno = '7788';

    DEPTNO      EMPNO ENAME
---------- ---------- ----------
        20       7788 SCOTT
 
 

有没有过这样的经历? 在sql*plus中敲了很长的命令后, 突然发现想不起某个列的名字了, 如果取消当前的命令,待查询后再重敲, 那太痛苦了. 当然你可以另开一个sql*plus窗口进行查询, 但这里提供的方法更简单.

比如说, 你想查工资大于4000的员工的信息, 输入了下面的语句:

scott@O9I.US.ORACLE.COM> select deptno,
  2  empno,
  3  ename
  4  from emp
  5  where

这时, 你发现你想不起来工资的列名是什么了.

这种情况下, 只要在下一行以#开头, 就可以执行一条sql*plus命令, 执行完后, 刚才的语句可以继续输入

scott@O9I.US.ORACLE.COM> 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
 
 
 

也许你还不知道 - sqlplus的小秘密(4)

这个也许不算什么秘密, 很多人大概都知道, 不过用过的人也许不多.

在8.1.7版本(也许是816? 不太确定)以后, sql*plus中有一个set markup html的命令, 可以将sql*plus的输出以html格式展现.


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

















EMPNO

ENAME

7369

SMITH

7499

ALLEN

;

注意其中的spool on, 当在屏幕上输出的时候, 我们看不出与不加spool on有什么区别, 但是当我们使用spool filename 输出到文件的时候, 会看到spool文件中出现了等tag.

; spool c:emp.htm


; /




......此处省略

; spool off

查看生成的emp.htm文件的内容:





SQL*Plus Report


; /

















EMPNO

ENAME

7369

SMITH

7499

ALLEN

; spool off



用ie打开emp.htm文件后的样式如下:

现在看看spool off的情况下:

; set markup html on spool off


; spool c:emp2.htm


; /

















EMPNO

ENAME

7369

SMITH

7499

ALLEN

; spool off

由于这段代码中没有html文件头, 所以我们可以直接作为内容插入到网页中, 现在我们就可以把这段代码放到下面作为示例:

EMPNO ENAME
7369 SMITH
7499 ALLEN

总结: 如果要生成一个完整的html文件, 就使用spool on选项, 如果只是要内容部分(用来添加到一个现有的网页中), 那么就使用spool off选项.

另外, set markup html还有很多选项可以用来定制生成的html的各个部分, 例如head, body, table等, 这里不再逐一说明, 详细信息可以参考SQL*Plus User's Guide and Reference.

适用场景: 当需要定时更新一个从数据库中获取内容的静态页面时, 这种方法绝对是快捷的并且容易实现的.

阅读(1255) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~