分享

oracle新手入门指导之四——ORACLE数据类型[天源迪科论坛]

 foreverfp 2008-07-29
oracle新手入门指导之四——ORACLE数据类型

数据类型参数描述char(n)n=1 to 2000字节定长字符串,n字节长,如果不指定长度,缺省为1个字节长(一个汉字为2字节)varchar2(n)n=1 to 4000字节可变长的字符串,具体定义时指明最大长度n,
这种数据类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。
如果数据长度没有达到最大值n,Oracle 8i会根据数据大小自动调节字段长度,
如果你的数据前后有空格,Oracle 8i会自动将其删去。VARCHAR2是最常用的数据类型。
可做索引的最大长度3209。number(m,n)m=1 to 38
n=-84 to 127可变长的数值列,允许0、正值及负值,m是所有有效数字的位数,n是小数点以后的位数。
如:number(5,2),则这个字段的最大值是999.99,如果数值超出了位数限制就会被截取多余的位数。
如:number(5,2),但在一行数据中的这个字段输入575.316,则真正保存到字段中的数值是575.32。
如:number(3,0),输入575.316,真正保存的数据是575。 date无从公元前4712年1月1日到公元4712年12月31日的所有合法日期,
Oracle 8i其实在内部是按7个字节来保存日期数据,在定义中还包括小时、分、秒。
缺省格式为DD-MON-YY,如07-11月-00 表示2000年11月7日。 long无可变长字符列,最大长度限制是2GB,用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用varchar2类型。
long 是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。 raw(n)n=1 to 2000可变长二进制数据,在具体定义字段的时候必须指明最大长度n,Oracle 8i用这种格式来保存较小的图形文件或带格式的文本文件,如Miceosoft Word文档。
raw是一种较老的数据类型,将来会逐渐被 BLOB、CLOB、NCLOB等大的对象数据类型所取代。 long raw无可变长二进制数据,最大长度是2GB。Oracle 8i用这种格式来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件。
在同一张表中不能同时有long类型和long raw类型,long raw也是一种较老的数据类型,将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。 blob
clob
nclob无三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件,最大长度是4GB。
LOB有几种类型,取决于你使用的字节的类型,Oracle 8i实实在在地将这些数据存储在数据库内部保存。
可以执行读取、存储、写入等特殊操作。 bfile无在数据库外部保存的大型二进制对象文件,最大长度是4GB。
这种外部的LOB类型,通过数据库记录变化情况,但是数据的具体保存是在数据库外部进行的。
Oracle 8i可以读取、查询BFILE,但是不能写入。
大小由操作系统决定。

oracle中一些特殊数据类型的用法2007-07-03 13:44一 . raw
RAW,类似于CHAR,声明方式RAW(L),L为长度,以字节为单位,作为数据库列最大2000,作为变量最大32767字节。
LONG RAW,类似于LONG,作为数据库列最大存储2G字节的数据,作为变量最大32760字节
建表操作:
create table raw_test (id number, raw_date raw(10));
插入raw数据操作:
insert into raw_test values (1, hextoraw(‘ff‘));
insert into raw_test values (utl_raw.cast_to_raw(‘051‘));//这个函数我在sqlplus里面试验不行
删除表操作:
drop table raw_test;
当使用HEXTORAW时,会把字符串中数据当作16进制数。而使用UTL_RAW.CAST_TO_RAW时,直接把字符串中每个字符的ASCII码存放到RAW类型的字段中
二 date,datetime,timestamp
date插入的时候使用to_char函数,如下
SQL> desc test45;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
A1 FLOAT(126)
A2 DATE
SQL> insert into test45 values(12.445,to_date(‘2006-11-30‘,‘yyyy-mm-dd‘));
timestamp:
Oracle定义语法:
TIMESTAMP [(fractional_seconds_precision)]
fractional_seconds_precision 的范围为0到9, 默认为6. 与DATE类型相比该类型可以保存到微秒. 而且微秒的精确范围可以保存到0到9为数据. 在数据库中保存占7到11字节, 具体看你定义的fractional seconds的精度. 下面例子说明:
-- 建表包含timestamp类型.
SQL> create table tm(a timestamp);
Table created.
-- 注意这地方的FF中的‘123456789‘, 这就是我刚说的微秒的精确范围, 上面定义的时候没有指定, 这就是使用默认的6了, 在下面"desc tm"处就可以看到的.
SQL> insert into tm values(TO_TIMESTAMP(‘2006-12-01 12:12:09.123456789‘, ‘YYYY-MM-DD HH24:MI:SS.FF‘));
1 row created.
-- 从这地方就可以看出来默认是6了. 要是你想使用更高的精确度就可以自己人为的指定了. create table tm(a timestamp(9)); 这样就可以的.
SQL> desc tm;
Name Null? Type
------- -------- ----------------------------
A TIMESTAMP(6)
--从这就可以看出来吧, 精确度为6时候,在插入数据时就使用了四舍五入了.
SQL> select * from tm;
A
---------------------------------------------------------------------------
01-DEC-06 12.12.09.123457 PM
-- 如果我想插入的数据超过了最大的9位时就会出错了的.
SQL> insert into tm values(TO_TIMESTAMP(‘2006-12-01 12:23:09.1234567890‘, ‘YYYY-MM-DD HH24:MI:SS.FF‘));
insert into tm values(TO_TIMESTAMP(‘2006-12-01 12:23:09.1234567890‘, ‘YYYY-MM-DD HH24:MI:SS.FF‘))
ERROR at line 1:
ORA-01830: date format picture ends before converting entire input string
-----------------------
查看当前的timestamp时间是CURRENT_TIMESTAMP
select current_timestamp from dual;
SQL> desc test47;
名称 是否为空? 类型
----------------------------------------- -------- -------------------------
A1 RAW(10)
A2 TIMESTAMP(6)
SQL> insert into test47 values(hextoraw(‘ff‘),systimestamp);
三 interval
INTERVAL ‘integer [- integer]‘ {YEAR | MONTH} [(precision)][TO {YEAR | MONTH}]
该数据类型常用来表示一段时间差, 注意时间差只精确到年和月. precision为年或月的精确域, 有效范围是0到9, 默认值为2.
eg:
INTERVAL ‘123-2‘ YEAR(3) TO MONTH
表示: 123年2个月, "YEAR(3)" 表示年的精度为3, 可见"123"刚好为3为有效数值, 如果该处YEAR(n), n<3就会出错, 注意默认是2.
INTERVAL ‘123‘ YEAR(3)
表示: 123年0个月
INTERVAL ‘300‘ MONTH(3)
表示: 300个月, 注意该处MONTH的精度是3啊.
INTERVAL ‘4‘ YEAR
表示: 4年, 同 INTERVAL ‘4-0‘ YEAR TO MONTH 是一样的
INTERVAL ‘50‘ MONTH
表示: 50个月, 同 INTERVAL ‘4-2‘ YEAR TO MONTH 是一样
INTERVAL ‘123‘ YEAR
表示: 该处表示有错误, 123精度是3了, 但系统默认是2, 所以该处应该写成 INTERVAL ‘123‘ YEAR(3) 或"3"改成大于3小于等于9的数值都可以的
INTERVAL ‘5-3‘ YEAR TO MONTH + INTERVAL ‘20‘ MONTH =
INTERVAL ‘6-11‘ YEAR TO MONTH
表示: 5年3个月 + 20个月 = 6年11个月
与该类型相关的函数:
NUMTODSINTERVAL(n, ‘interval_unit‘)
将n转换成interval_unit所指定的值, interval_unit可以为: DAY, HOUR, MINUTE, SECOND
注意该函数不可以转换成YEAR和MONTH的.
NUMTOYMINTERVAL(n, ‘interval_unit‘)
interval_unit可以为: YEAR, MONTH
eg: (Oracle Version 9204, RedHat Linux 9.0)
SQL> select numtodsinterval(100,‘DAY‘) from dual;
NUMTODSINTERVAL(100,‘DAY‘)
---------------------------------------------------------------------------
+000000100 00:00:00.000000000
SQL> c/DAY/SECOND
 1* select numtodsinterval(100,‘SECOND‘) from dual
NUMTODSINTERVAL(100,‘SECOND‘)
---------------------------------------------------------------------------
+000000000 00:01:40.000000000
SQL> c/SECOND/MINUTE
 1* select numtodsinterval(100,‘MINUTE‘) from dual
NUMTODSINTERVAL(100,‘MINUTE‘)
---------------------------------------------------------------------------
+000000000 01:40:00.000000000
SQL> c/MINUTE/HOUR
 1* select numtodsinterval(100,‘HOUR‘) from dual
NUMTODSINTERVAL(100,‘HOUR‘)
---------------------------------------------------------------------------
+000000004 04:00:00.000000000
SQL> c/HOUR/YEAR
 1* select numtodsinterval(100,‘YEAR‘) from dual
select numtodsinterval(100,‘YEAR‘) from dual
ERROR at line 1:
ORA-01760: illegal argument for function
SQL> select numtoyminterval(100,‘year‘) from dual;
NUMTOYMINTERVAL(100,‘YEAR‘)
---------------------------------------------------------------------------
+000000100-00
SQL> c/year/month
 1* select numtoyminterval(100,‘month‘) from dual
NUMTOYMINTERVAL(100,‘MONTH‘)
---------------------------------------------------------------------------
+000000008-04
时间的计算:
SQL> select to_date(‘1999-12-12‘,‘yyyy-mm-dd‘) - to_date(‘1999-12-01‘,‘yyyy-mm-dd‘) from dual;
TO_DATE(‘1999-12-12‘,‘YYYY-MM-DD‘)-TO_DATE(‘1999-12-01‘,‘YYYY-MM-DD‘)
---------------------------------------------------------------------
11 -- 可以相减的结果为天.

ORACLE中的to_date问题:ORA-01843: 无效的月份+with check option
myrtle 发表于 2006-4-9 16:53:00
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQLPLUS中运行:
 6 TO_DATE(‘07-JUN-99‘, ‘DD-MON-RR‘),
 7 ‘ST_CLERK‘, 5000);
 TO_DATE(‘07-JUN-99‘, ‘DD-MON-RR‘),
ERROR 位于第 6 行:
ORA-01843: 无效的月份
设置运行程序客户端的oracle 注册表参数
NLS_DATE_LANGUAGE = AMERICAN 即可。
或在会话级修改:
SQL> ALTER session set NLS_DATE_LANGUAGE=american;
会话已更改。
SQL> select sysdate from dual;
SYSDATE
--------------------
09-APR-2006 16:53:12
INSERT INTO (SELECT employee_id, last_name, email,
 hire_date, job_id, salary
 FROM employees
 WHERE department_id = 50 WITH CHECK OPTION)
VALUES (99998, ‘Smith‘, ‘JSMITH‘,
 TO_DATE(‘07-JUN-99‘, ‘DD-MON-RR‘),
 ‘ST_CLERK‘, 5000);
--------------------
WITH CHECK OPTION用法
如 果视图定义包括条件(譬如 WHERE 子句)并且其意图是确保任何引用该视图的 INSERT 或 UPDATE 语句都应用 WHERE 子句,则必须使用 WITH CHECK OPTION 定义该视图。这个选项可以确保数据库中正在修改的数据的完整性。如果在 INSERT 或 UPDATE 操作期间违反了条件,则返回 SQL 错误。
下面是一个使用了 WITH CHECK OPTION 的视图定义的示例。要确保总是检查条件,WITH CHECK OPTION 是必需的。在这种情况下,我们希望确保 DEPT 总是 10。这会限制 DEPT 列的输入值。当使用视图插入新值时,总是强制执行 WITH CHECK OPTION。
CREATE VIEW EMP_VIEW2
 (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
 AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
 WHERE DEPT=10
 WITH CHECK OPTION;
如果这个子句不存在,那么某个使用该视图的用户就有可能更新某条记录,使其不再属于该视图。例如,下列 SQL 语句可能会引起一些问题。
UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10;
这个语句的结果是该视图现在不包含任何记录,因为部门 10 不再有雇员了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多