a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 372|回复: 0

[考试辅导] oracle认证应用技术学习资料汇总12

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
解决ora-01861文字与格式的字符串不匹配 9 n% M, `$ o/ T/ _
症状:c/s程序本来运行正常,一次重装系统,重装oracle客户端后,insert日期格式数据,出现题目中错误。
5 D& L& v# c4 A9 j9 i, E  解决办法:
2 p* R4 J5 ]$ hOracle时间格式讨论
0 N8 }2 l9 s2 _( n$ u& p: B: J  $ e) j2 }0 E0 y
在网上看见不少oracle新学者对oracle的时间格式很烦,经常是设计了一个带时间字段的表之后,向表插入数据失败。回想起自己刚开始学习oracle时,也对这个时间格式摸不着头脑,虽然是小小的问题,高手们不屑于讨论,但对初学者来讲,这也是一个不大不小的坎,没找到门路的话, 可能几天都过不去,其实就是一层窗户纸,没什么难的。这里做一个简单的小结,因水平有限,请高手补充指正。
$ j) R; Q" F  A  
' J9 T7 T  P* ^/ J$ z7 v" n  r  1 oracle对时间格式的数据存贮
1 t+ e$ K4 p8 @8 J- Horacle数据库中存放时间格式的数据,是以oracle特定的格式存贮的,占7个字节,与查询时显示的时间格式无关,具体哪个字节表示什么,我不太清楚,请高手补充。存贮的时间包括年月日时分秒,最小精度为秒,不存贮秒以下的时间单位。因此在一些前台支持毫秒级的程序(如PB客户端程序)连接到oracle数据库时应注意这点。查询时显示的时间格式,由会话环境决定,或者由用户定义,与数据库无关。
9 Q( t; L) k4 C" L4 c& U. `( a  
2 f8 I! g* e9 p# B2 Z. |  2 oracle时间显示形式
8 K, ^5 j8 E! j3 T2 I通常,客户端与数据库建立起连接后,oracle就会给一个缺省的时间格式数据的显示形式,与所使用的字符集有关。一般显示年月日,而不显示时分秒。例如,使用us7ascii字符集(或者是其他的英语字符集)时,缺省的时间格式显示为:28-Jan-2003,而使用zhs16gbk字符集(或其他中文字符集)时时间格式缺省显示为:2003-1月-28.向表中插入数据时,如果不使用转换函数,则时间字段的格式必须遵从会话环境的时间格式,否则不能插入。查看当前会话的时间格式,可以使用以下的SQL语句:SQL> select sysdate from dual;(只能按照此语句的结果,才能插入数据)
8 J' B9 ]- \) t+ j" _  * V0 W7 T- E4 p2 k7 b
  3 向oracle表中插入时间格式的数据   B2 z3 {* n, v" q6 x* v
向oracle表插入时间格式的数据是一个相对来讲比较麻烦的事情,要么你严格遵从当前会话的时间格式书写你的时间值,要么使用转换函数自定义时间数据的格式。有两个与时间相关的转换函数:to_char 和 to_date .to_char(时间值,时间格式)函数将时间值转换为字符串形式,通常在查询中使用;to_date(字符串,时间格式)则把格式字符串转换时间值,通常在insert 语句中使用。(呵呵,程序中没这样做,所以出错)在日期格式中,各种日期格式分量这里不作详细的讨论,请查oracle帮助文档中这两个函数的用法,或者查一查PL/SQL编程的书,讲得很详细的。
6 }- @2 i$ _- ]* @7 f: }  1 R( H$ d5 y& V! c  l8 P5 h& c
  4 如何修改会话中的日期格式
2 X0 S; @  w" o6 G* f- q修改当前会话中的日期格式据说有三种办法,我只做过前两种办法的试验,修改glogin.sql文件的办法我没有试过,不知道是不是真的能行。下面一一解说。 ) P0 t0 K5 U8 F7 e
  
2 E5 j8 b( V6 x0 R$ p% _  (1) 在sql*plus中修改当前会话的日期格式SQL> alter session set nls_date_format = ’yyyy-mm-dd hh24:mi:ss’;将当前会话的时间格式修改为这种格式: 2003-01-28 15:23:38,即四位年-两位月-两位日,空格,24小时的制的小时:分钟:秒。
1 J  L  F% J" b% t0 Q3 Z, G4 b' ]  . c0 s" b1 m5 q2 q
这种修改方法,只对当前会话有效。注意,是对当前会话,而不是当前的sql*plus窗口。即如果你这样修改之后,又使用connect命令以其他用户连接到数据库或者是连接到其他的数据库,则这个日期格式就失效了,又恢复到缺省的日期格式。
9 D" Y, O# b: z9 O2 P7 ?  ( P0 T/ J; k- f4 P7 {, {
  (2) 修改注册表(只对windows系统)
' i" u9 i4 C; m 在注册表hkey_local_machinesoftwareoraclehome0主键中增加一个字串(8i版本,9i也可以),字串名为nls_date_format,字串的值为你希望定义的时间格式,如: yyyy-mm-dd hh24:mi:ss ,然后重新启动sql*plus.这种修改方法,对sql*plus窗口有效,即不论你打开多少个sql*plus窗口,缺省的都是这种时间格式。修改服务器端的注册表无效,只有修改客户端的注册表才有效。
( R- d% ]" O/ z4 r# cunix系统下有没有这类似的方法,我不知道,我不会用unix或者是linux系统。
1 R1 [" i: {9 u9 M; z3 e* T  
+ a; M% m7 v( A(3) 修改$oracle_homesqlplusadmin目录中glogin.sql文件这种方法我没有试过,不敢乱说,以免误导大家。请了解这种方法的高手来指教。
; x+ O/ i$ p, W# r+ w6 w  ; V5 B" B# R, j
  5 日期格式的优先级
) k) i! E& d7 ~$ [8 q如果在一个具体的环境中,既修改了注册表,又使用alter session命令修改了当前会话,那么哪一种修改方法有效呢?alter session命令有效,它的优先级是最高的。即不管当前的客户端环境是什么样的,注册表修改成什么样子了,只要你使用了alter session命令来修改了时间格式,那么就以你修改后的时间格式为准。 ' h6 _7 f% E  ~, i
  
& |& v1 q. u: f! N8 J因此,如果直接使用sql*plus交互式查询或插入时间格式的数据,两种方法都可以用。如果使用sql文件来进行批量的插入或者是定时执行,最好在使用时间数据前使用alter session命令来修改会话,以保证这个sql语句的正常运行与环境无关。同样的,如果是前台的客户端程序中需要使用到时间格式的数据,最好也在使用之前修改会话,或者使用to_char或to_date函数进行转换(强烈推荐使用转换函数),以保证程序运行与环境无关。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-5 16:16 , Processed in 0.386217 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表