12
Sep

Oracle的问题两则

Oracle: 请输入 d 的值

一直没怎么认真用过Oracle,今天因为项目需要写了一个bat脚本批量导数据进去,却遭遇了上述的问题。

先前误以为是timestamp引起的,因为有个字段类型就是timestamp(6) NOT NULL的,我的SQL插入语句中用到了类似 TO_TIMESTAMP(’08/29/07 10:40:12′, ‘MM/DD/YY HH24:MI:SS’) 这样的语法,能够运行,却一直提示输入 d 的值。

后来发现另外一个varchar2的字段的值中有一个特殊符号 & ,猜想是不是它的缘故,去掉之后果然问题消失。

看来&在Oracle中是作为提示符的前缀来处理的,因为输入的字符串是“……R&D……”,所以它就一直提示输入d的值。

经过摸索,解决办法有三:

  1. 在sql文件的第一行加上一句:SET DEFINE OFF;
  2. 将&单独分开来,用字符串连接符||来处理:’R'||’&'||’D
  3. 用AscII码来表示特殊字符:’R'||chr(38)||’D

另外,使用批处理导入sql的命令可以用以下格式:

%ORACLE_HOME%\bin\sqlplus.exe username/password@connectionString @”%PATH%\yourfile.sql” > “%PATH%\yourfile.log”

另外,每个sql文件的末尾加上一句“exit;”以方便它执行完毕后自动退出。

空字符串和NULL问题

按照以往mysql的经验来看,null的值需要特殊处理和判断,比较麻烦,针对字符串类型的字段,设定属性为Not Null然后给个空字符串(”)要比给null处理起来方便的多。

但是今天在oracle中想如法炮制的时候却遭遇了不幸。直接提示说插入值不能为null(因为建表的时候已经设定为not null),但是我给的明明是空字符串。google后发现(这里顺便BS一下国内的网站,都是copy来copy去的,含金量太少),oracle中就是把空字符串当成null的,两者基本等同。具体可以看这里: http://www.bristle.com/Tips/SQL.htm#differences_in_sql_semantics

所以针对null值要用一个特殊的函数nvl(original_value, new_value_if_null)来处理,具体用法可以看oracle的帮助文档。

到这里吧,就到这里吧。

03
Sep

杂念2007.09.03

已经很久没有这么晚睡了,这块自留地也快长满杂草了,今天顺便种点庄稼。

无意间点进了大学同学的msn space,一个女强人,在我的概念中她很少有服软的时候。一路看她奋斗的历程,足迹不算太深却很清晰,而且,目标明确。
想想自己,除了碌碌的瞎忙活,基本上失去了当初的激情,更重要的是,似乎没了方向。

书,很久没有翻了 —— 哪怕杂志;
技术,也久未练手了 —— 甚至仅仅是阅读;
英语,都快张不开口了 —— 基本退回四级水平;
朋友,差不多快要生疏了 —— 想起了小三;

总得做点什么,改变才能有新鲜血液,这道理很小的时候跟人玩牌就懂了,这会儿怎么反而淡忘了。

又及,看到大头求婚帖了,祝福他和小白。不知道自己将来是否有这番心境做类似举动。

晚安,cube。我会清醒的。