如何将数字类型按照习惯格式显示
在使用查询语句查询数字类型结构,可以有许多种显示格式,比如财务人员喜欢每3位数加一个逗号,如$210,348,986.00 等。
✿问题的提出
在现实生活中显示数字结果可以有多种格式,那么SQL*Plus是否支持各种格式的描述以满足各自的喜好吗?
✿实现技术
在SQL*Plus 支持对数字、日期、字符等显示格式的指定,比如,你可指定数字的显示格式为999,999.00,这个命令就是COLumn 命令,这个命令的语法是Col column_name format ,其中colmun_name 是列名或列别名;format是格式描述。
✿实现步骤
在查询数字类型前,先用COL对列进行指定,然后再查询即可,如:
-- --适应版本:Oracle 9i~12c -- --没有指定列的显示格式前的情况: SQL> select ename,sal from emp where deptno=20;
ENAME SAL ---------- ---------- SMITH 800 JONES 2975 SCOTT 3000 ADAMS 1100 FORD 3000
SQL> col sal format 999,999.00 SQL> /
ENAME SAL ---------- ----------- SMITH 800.00 JONES 2,975.00 SCOTT 3,000.00 ADAMS 1,100.00 FORD 3,000.00 |
✿说明
显示格式的描述有许多种,你可参考SQL*Plus® User’s Guide andReference原版资料。如果你希望清除你刚指定的显示格式,可发出CLEAR COLUMNS命令即可。
如何查询LONG类型数据
在Oracle 系统的历史中,Oracle 旧版本一直使用LONG类型存储大对象数据,即使现在Oracle 版本支持使用LOB(即BLOB、CLOB、 BFILE) 类型,但LONG类型仍然支持,特别是Oracle系统的数据字典许多还使用long类型存储大文本数据。
✿问题的提出
如果表的大文本数据以long 类型存储,则在SQL*Plus 下可对long 列进行查询时,你只能看到long 列的前80个字符,因为默认值行的宽度是80个字符。那么,如何才能看到LONG类型的完整信息呢?
✿实现技术
可通过SET LONG {80 | n}命令来实现显示更多的LONG列的结果,这里的n表示字节数,可以是1~2,000,000,000之间的数。
✿实现步骤
在会话级上,可随时用set LONG命令设置LONG类型的显示字节数,当你没有设置前默认的LONG类型的显示字节数一直是80字节,如:
-- --适应版本:Oracle 9i~12c -- SQL> desc dba_views 名称 是否为空? 类型 ----------------------------------------------------- -------- -------------- OWNER NOT NULL VARCHAR2(30) VIEW_NAME NOT NULL VARCHAR2(30) TEXT_LENGTH NUMBER TEXT LONG … … SQL> show long long 80 SQL> col owner for a20 SQL> col view_name for a20 SQL> set line 180 SQL> select owner,view_name,text from dba_views where owner='SCOTT';
OWNER VIEW_NAME TEXT -------------------- -------------------- ------------------------------------------------ SCOTT CLERK select empno,ename,deptno,job From emp where job= 'CLERK' With check o
SCOTT DEPT20 select ename,deptno,job, sal*12 sal12 From emp where deptno=20
SCOTT DML_EMP select empno,ename,job,deptno From emp
SCOTT EMP20 select deptno,count(*) tot_emp,sum(sal) tot_sal from emp group by deptno
SCOTT V_DEPT select "DEPTNO","DNAME","LOC" from dept SQL>--设置LONG 类型的显示字节为3200后,在运行同样的查询语句: SQL> set long 32000 SQL> l 1* select owner,view_name,text from dba_views where owner='SCOTT' SQL> /
OWNER VIEW_NAME TEXT -------------------- -------------------- ----------------------------------------------- SCOTT CLERK select empno,ename,deptno,job From emp where job= 'CLERK' With check option
SCOTT DEPT20 select ename,deptno,job, sal*12 sal12 From emp where deptno=20
SCOTT DML_EMP select empno,ename,job,deptno From emp
SCOTT EMP20 select deptno,count(*) tot_emp,sum(sal) tot_sal from emp group by deptno
SCOTT V_DEPT select "DEPTNO","DNAME","LOC" from dept |
✿说明
在SQL>下查询带LONG类型前,建议先用set long n命令设置LONG类型的显示字节数,否则,你只看到前80个字节的字符数。
如何拷贝一个包含LONG类型的表
虽然现在11g/12c版本不提倡使用LONG数据类型来存储表的大文本数据,但是Oracle本身的许多内部数据字典也还采用LONG类型来存储大文本数据,此外,可能一些历史数据仍然采用LONG类型来存储。
✿问题的提出
由于Oracle 系统的LONG数据类型是一个特殊的类型,它与BLOB或CLOB等存储原理不同,因此,Oracle并不支持直接对待有LONG类型的表的拷贝,特别是不允许直接使用CREATE TABLE … AS SELECT *这样的CTAS方法对带有LONG数据的表进行复制,那么,你如何拷贝带来LONG类型的表呢?
✿实现技术
既然Oracle不支持直接对LONG类型的CTAS方法,那么它就会提供另外的方法来实现跨数据库的表的拷贝,这个命令就是COPY命令,值得指出的是这里的COPY不是OS命令,而是SQL*Plus命令。
✿实现步骤
在SQL*Plus环境下,可用COPY命令拷贝带有long类型的表,这个命令的不是OS 命令,也不是SQL语句,它是Oracle 系统的命令。COPY语法如下:
COPY{FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE}destination_table [(column, column, column, ...)]
USING query
下面例子是从一个远程拷贝以个带有long 类型的表的过程。
-- --适应版本:Oracle 9i~12c -- SQL> COPY FROM HR@HQ TO JOHN@WEST REPLACE WESTEMPLOYEES USING SELECT * FROM EMPLOYEES |
✿说明
在许多的应用数据迁移当中,经常遇到带有long 类型的表,你在进行拷贝前,建议从数据字典来查询哪些表带有long 数据类型,然后采用copy方法来统一拷贝这些表的数据到新环境的Oracle系统中。
Oready即为“One Technology Ready”!
Oready不仅仅是数据库领域的专家,同时也是一个社区,我们汇集百位数据库领域资深顾问、讲师,服务于数据中心的技术支持与技能传授,注重对客户的关键数据库运营支撑,强调经验的分享-Skill Transfer,聚焦数据中心的完美结合.