急:创建表时如何能使用整数类型? (200分)

  • 主题发起人 主题发起人 snowboat
  • 开始时间 开始时间
S

snowboat

Unregistered / Unconfirmed
GUEST, unregistred user!
  
Oracle 8.0.5 ,执行下面的SQL语句的时候出错,报告“无效数据类型”。
Create table test (abc BINARY_INTEGER)
  
还有,试图使用PLS_INTEGER类型时也是同样的错误。

可是在这个Oracle自带的帮助中都写了这两个数据类型啊。
  
 
BINARY_INTEGER、PLS_INTEGER等类型都不能用于表结构,只能用于存储过程
你见它的帮助里用来创建表了吗?
 
to xianjun
谢谢你的解答!
也就是说,创建表时,若需要数值型字段,只能用又大又笨又慢又麻烦的Number?恐怖!
Delphi的integer是32位,上限是2147483648,用number,如果写number(10)就可能溢出,
如果写number(9)就会浪费,如果定义约束条件就会增加复杂性、拖慢速度。难道大名鼎
鼎的Oracle就这么笨吗?连个二进制的字节、字、双字类型的数值型字段都不支持?!
真要Faint了!
 
正如你所说,number类型是可以自己定义精度及范围的
怎么会“又大又笨又慢又麻烦”呢?
比如说你要存放年龄,搞个number(3)就足够了,不会多占用任何空间
要存放一个房间的面积,来个number(7, 4)怎么样也搞定了,还有四位小数的精度
总之,这是很灵活的一个类型。
 
  
谢谢xianjun!
  可是,据我所知,number是以BCD形式处理的,而不是二进制形式,因此一个十进制位
要占用两个字节。同样表示32位的整型数,二进制整数只要用4字节,number就要用20字节。
因此说Number类型“大”。
  很简单的一个数,明明一两个字节就能存下,却也要用好多字节的BCD,因此说Number
类型“笨”。
  正因为为不是二进制处理,所以不能充分利用CPU和其他硬件的快速的整数、定点和浮
点运算功能,只能用一定的算法逐位计算。因此说Number类型“慢”。
  Delphi的Integer类型是常用的类型,和各种数据库配合很好,其上限是2147483648,
但用Number表示,还要约束其范围,可是写Number(10)就可能溢出,写Number(9)就会不够,
因此说Number类型“麻烦”。
最后,我个人的感觉,像Oracle这样大名鼎鼎的数据库,应该支持一个通用的被大家认
可了的广泛流传的高效的短小精悍的类似于Delphi的Integer类型的32位整型,真的应该有
这么一个类型。
如果我的理解有误还请不吝赐教。
  
 
那肯定是你理解有误了[:)]
Oracle的number类型最大支持10的38次方大小的数值
而在存储方面,是1-20字节变动,也就是说number的最大长度就是20字节!
 
  
1、不是说存储,是说处理。
  你可以在Delphi中,某个过程里,设置一个TField类型的局部变量,然后打开数据集,
将Number类型的字段赋值给局部变量(注意不是赋字段的值,而是赋字段对象给它),然后
在View->DebugWindow->LocalVariables中看TField的类型,是BCD类型的。

2、麻烦
  如果使用Number类型和Delphi中的Integer对应,就要加位数限制和范围约束,肯定会
增加麻烦,降低速度。

3、我最“愤慨”的事
  我最愤慨、最不能理解的事:32位整型非常通用,非常容易实现,非常高效,非常易用,
为什么大名鼎鼎的Oracle不提供?!
   
 
不会吧,可惜我用的是SQL SERVER,ORacle不太清楚
 
大名鼎鼎的,不见得面面俱到,Oracle有好多功能不见得好用.和其他数据库产品比较,各有利弊.
 
查查资料看
-------------------------------------------------------------------
Table 12-3 ANSI Datatype Conversions to Oracle Datatypes

ANSI SQL Datatype Oracle Datatype
CHARACTER (n), CHAR (n) CHAR (n)
NUMERIC (p,s), DECIMAL (p,s), DEC (p,s) NUMBER (p,s)
INTEGER, INT, SMALLINT NUMBER (38)
FLOAT (p) FLOAT (p)
REAL FLOAT (63)
DOUBLE PRECISION FLOAT (126)
CHARACTER VARYING(n), CHAR VARYING(n) VARCHAR2 (n)
-------------------------------------------------------------------
 
是的,oracle不支持二进制的integer,即使是integer类型也是内部用number实现的
其他的一些大型的数据库也没有二进制的integer。大概是数据库的标准吧
而且使用二进制的integer也受制于cpu的类型,跨系统不够方便吧
 
谢谢各位!尤其感谢xianjun和Pipi的讲解!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部