[20140823]在sqlplus使用copy注意.txt

[20140823]在sqlplus使用copy注意.txt

--有时候使用copy来复制表数据,但是前几天我的测试遇到一些小问题,做一个记录,总之还是小心注意这些细节.

SCOTT@test01p> @ver
BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

create table tt (id number,idx number);
insert into tt values (1,1.1111);
insert into tt values (2,2.2222);
insert into tt values (3,3.3333);
commit ;

SCOTT@test01p> select * from tt;
ID        IDX
--- ----------
  1     1.1111
  2     2.2222
  3     3.3333

SCOTT@test01p> copy to scott/btbtms@test01p create tt1 using select * from tt;

Array fetch/bind size is 200. (arraysize is 200)
Will commit when done. (copycommit is 0)
Maximum long size is 20000000. (long is 20000000)
Table TT1 created.

   3 rows selected from DEFAULT HOST connection.
   3 rows inserted into TT1.
   3 rows committed into TT1 at scott@test01p.

--对比看看.

SCOTT@test01p> select id,idx,dump(idx,16 ) c30  from tt;
        ID        IDX C30
---------- ---------- ------------------------------
         1     1.1111 Typ=2 Len=4: c1,2,c,c
         2     2.2222 Typ=2 Len=4: c1,3,17,17
         3     3.3333 Typ=2 Len=4: c1,4,22,22

SCOTT@test01p> select id,idx,dump(idx,16 ) c30  from tt1;
        ID        IDX C30
---------- ---------- ------------------------------
         1          1 Typ=2 Len=2: c1,2
         2          2 Typ=2 Len=2: c1,3
         3          3 Typ=2 Len=2: c1,4

--很明显idx拷贝后丢失了小数点后的信息,太可怕了,难道没人遇到这个问题吗?重复测试,idx定义后面的小数点

drop table tt purge;
drop table tt1 purge;
create table tt (id number,idx number(12,4));
insert into tt values (1,1.1111);
insert into tt values (2,2.2222);
insert into tt values (3,3.3333);
commit ;
copy to scott/btbtms@test01p create tt1 using select * from tt;

--对比看看.
SCOTT@test01p> select id,idx,dump(idx,16 ) c30  from tt;
        ID        IDX C30
---------- ---------- ------------------------------
         1     1.1111 Typ=2 Len=4: c1,2,c,c
         2     2.2222 Typ=2 Len=4: c1,3,17,17
         3     3.3333 Typ=2 Len=4: c1,4,22,22

SCOTT@test01p> select id,idx,dump(idx,16 ) c30  from tt1;
        ID        IDX C30
---------- ---------- ------------------------------
         1     1.1111 Typ=2 Len=4: c1,2,c,c
         2     2.2222 Typ=2 Len=4: c1,3,17,17
         3     3.3333 Typ=2 Len=4: c1,4,22,22

--这样结果才正确,看看表的数据结构.

SCOTT@test01p> @desc tt
Name                    Null?    Type
----------------------- -------- ----------------
ID                               NUMBER
IDX                              NUMBER(12,4)

SCOTT@test01p> @desc tt1
Name                    Null?    Type
----------------------- -------- ----------------
ID                               NUMBER(38)
IDX                              NUMBER(12,4)

--可以发现字段id 类型从number变成了NUMBER(38).继续测试.

insert into tt1 values (4.4444,4.4444);
insert into tt1 values (5.5555,5.5555);
commit ;

SCOTT@test01p> select id,idx,dump(idx,16 ) c30  from tt1;
        ID        IDX C30
---------- ---------- ------------------------------
         1     1.1111 Typ=2 Len=4: c1,2,c,c
         2     2.2222 Typ=2 Len=4: c1,3,17,17
         3     3.3333 Typ=2 Len=4: c1,4,22,22
         4     4.4444 Typ=2 Len=4: c1,5,2d,2d
         6     5.5555 Typ=2 Len=4: c1,6,38,38

--可以发现插入的id数据丢失了小数点信息.
--正是因为copy后类型从number变成了number(38),导致小数点后面的位数丢失.而且像
--5.5555四舍五入,导致变成了6.这个算oracle的debug吗?

--我们还好,开发定义的数据类型都是包括小数点的,遇到的仅仅是几个字段,定义小数点后再copy问题消失.

--实际上一般讲数据定义是数字类型定义时最好包括精度和小数点位数,除非全部是整形不会出现小数点.
--还是拿tt表来说明.

如果插入:
insert into tt values (1/3,4.4444);
commit ;

SCOTT@test01p> column id format 99999999999999999999.999999999999999999999999999999999999999999
SCOTT@test01p> column id format 99999999999999999999.9999999999999999999999999999999999999999999
SP2-0246: Illegal FORMAT string "99999999999999999999.9999999999999999999999999999999999999999999"
SCOTT@test01p> select id,idx,dump(id,16) c60,dump(idx,16 ) c30  from tt;
                                           ID        IDX C60                                                          C30
--------------------------------------------- ---------- ------------------------------------------------------------ ------------------------------
1.000000000000000000000000000000000000000000     1.1111 Typ=2 Len=2: c1,2                                            Typ=2 Len=4: c1,2,c,c
2.000000000000000000000000000000000000000000     2.2222 Typ=2 Len=2: c1,3                                            Typ=2 Len=4: c1,3,17,17
3.000000000000000000000000000000000000000000     3.3333 Typ=2 Len=2: c1,4                                            Typ=2 Len=4: c1,4,22,22
  .333333333333333333333333333333333333333300     4.4444 Typ=2 Len=21: c0,22,22,22,22,22,22,22,22,22,22,22,22,22,22,2 Typ=2 Len=4: c1,5,2d,2d
                                                                            2,22,22,22,22,22

id=1/3,这种运算得到的结果长度占用21个字节,浪费存储空间.

总结:
1.使用copy时遇到定义number不包括小数点类型的要注意,copy后信息丢失的问题.
2.定义number最好包括精度和小数点位数,特别是生产系统,避免出现1/3这样的信息占用不必要的磁盘空间.
3.从某种意义讲我认为这个是bug.

时间: 2024-10-11 17:54:37

[20140823]在sqlplus使用copy注意.txt的相关文章

[20171121]rman backup as copy 2.txt

[20171121]rman backup as copy 2.txt --//昨天测试backup as copy ,备份时备份文件的文件头什么时候更新.是最后完成后还是顺序写入备份文件. --//我测试的数据文件使用数据文件2(表空间sysaux),也许是文件不够大,应该减慢备份速度来测试看看. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ----------------

[20160329]backup as copy问题.txt

[20160329]backup as copy问题.txt --别人问的一个问题,想通过dg建立测试库,我建议他停止日志应用,然后使用拷贝的方式建立测试库,只要路径一样,生成一个新的控 --制文件就ok了.本来一个很简单通过nfs mount文件系统,cp就ok了.没有选择cp而使用rman的backup as copy命令方式,遇到一点点 --小问题,自己重复测试看看: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                   

[20141216]sqlplus的set appinfo.txt

[20141216]sqlplus的set appinfo.txt --今天学习了sqlplus的set appinfo命令,可以设置module参数.做一个简单记录. --会话1: SCOTT@test> @ver BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0

[20140823]12c join convert连接转换.txt

[20140823]12c join convert连接转换.txt --前面提高12c执行计划的Partial Join Evaluation.现在看看12c join convert. --链接: 1.建立测试环境: SCOTT@test01p> @ver BANNER                                                                               CON_ID ---------------------------

[20120817]sqlplus 输出html格式.txt

[20120817]sqlplus 输出html格式.txt 许多blog介绍在sqlplus输出excel文件的方法,实际上执行的是:set markup HTML ON生成的是html格式的文件,只不过MS OFFICE可以当作电子表格文件打开! 利用这个特性,可以使用firefox打开. 参考链接如下: 建立html.sql文件: http://uhesse.com/2011/06/30/sqlplus-output-in-nice-html-format/ ---------------

[20120106]11G sqlplus set errorloging on.txt

在Oracle 11g版本的SQL*Plus中提供了一个非常有特色的选项errorlogging.当开启该选项之后,会话级别的错误都会写入到指定表中,是spool选项的有益补充.spool选项会将所有的输出信息都写入到指定文件文件中,这样会造成文件内容过于臃肿和繁杂.在使用errorlogging选项后,我们将只关注那些与报错有关的信息,可以认为该选项是spool选项的精华抽取. 例子:create table t  (id number constraint pk_t primary key)

[20150503]关于oracle的number类型.txt

[20150503]关于oracle的number类型.txt --节前的事情,别人建表使用number类型,本来想定义成number(10,2),结果少输入0,变成number(1,2). --在我的记忆里,好像前面的数值应该大于后面的精度的,没想到这样竟然可以通过,自己感到很奇怪! --测试下来,才知道自己oracle基本的东西都不是很清楚. 1.首先提到我以前写的一篇blog: [20140823]在sqlplus使用copy注意.txt http://blog.itpub.net/267

asp.net在项目目录下创建txt

问题描述 1.在页面1内添加文本框和按钮,点击按钮后,在项目目录下创建test.txt文件,并将文本框内容写入的文本文件内2.在页面2内添加按钮,点击按钮后,将文本文件test.txt复制到电脑桌面主体代码谢谢!!! 解决方案 解决方案二:你是要操作客户端,还是操作服务器端:如果是客户端那这种需求恐怕web实现不了哦:如果是服务器端你可以参考下System.IO命名空间下的文件处理:很简单的几个方法就可以搞定:解决方案三:文件操作看看msdn就行了,挺简单的至于复制到电脑桌面就不大可行了,不知道

iOS读取txt文件出现中文乱码的解决方法_IOS

一.情景描述:  后台给一个txt文件,编码是utf-8,在Mac电脑Xcode开发环境下读取txt文件内容,汉字会出现乱码,英文没有乱码这种情况.  二.尝试解决方法: 修改编码格式,尝试了NSUTF16StringEncoding,NSUTF8StringEncoding,NSASCIIStringEncoding编码等,出现的问题有时是中文乱码,有时是utf-8不能打开文件问题,最终问题都没能解决.  三.猜测原因: txt文件是从window电脑上创建,有可能和环境有关,第二,编码问题.