暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle如何查询输出与报表(中)

Oracle技术就绪 2015-09-28
616

如何将数字类型按照习惯格式显示


在使用查询语句查询数字类型结构,可以有许多种显示格式,比如财务人员喜欢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(BLOBCLOB BFILE) 类型,但LONG类型仍然支持,特别是Oracle系统的数据字典许多还使用long类型存储大文本数据。

问题的提出

如果表的大文本数据以long 类型存储,则在SQL*Plus 下可对long 列进行查询时,你只能看到long 列的前80个字符,因为默认值行的宽度是80个字符。那么,如何才能看到LONG类型的完整信息呢?

实现技术

可通过SET LONG {80 | n}命令来实现显示更多的LONG列的结果,这里的n表示字节数,可以是12,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数据类型是一个特殊的类型,它与BLOBCLOB等存储原理不同,因此,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,聚焦数据中心的完美结合.

文章转载自Oracle技术就绪,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论