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的值。
经过摸索,解决办法有三:
- 在sql文件的第一行加上一句:SET DEFINE OFF;
- 将&单独分开来,用字符串连接符||来处理:’R'||’&'||’D
- 用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的帮助文档。
到这里吧,就到这里吧。