oracle 特殊字符的插入  
  环境配置:  
  server:linux9  
  db server: oracle817.4  
  client os:windows2000 pro  
  oracle client: oracle 9i  
  今天一个同事运行脚本,向数据库中插入数据.数据的格式如下:  
  SQL> ed  
  已写入文件 afiedt.buf  
  1* insert into dept values(92,'Jackey&&jjjdd','HZ');  
  SQL> /  
  输入 jjjdd 的值: dd  
  原值 1: insert into dept values(92,'Jackey&&jjjdd','HZ');  
  新值 1: insert into dept values(92,'Jackeydd','HZ');  
  insert into dept values(92,'Jackeydd','HZ');  
  *  
  ERROR 位于第 1 行:  
  ORA-00911: invalid character  
  结果发现到数据库中的数据和插入的数据不一致.主要表现是在插入的字符串的中如果包括了'&',  
  则'&'后面的字符就会丢失.  
  后来发现了造成这种情况的原因.因为'&'在sqlplusw中被定义为自定义变量标示符合,因此'&'  
  符合后面的字符自然被解析为变量名字.因为没有输入变量的值,所以'&'后面的内容被认为是空的了.  
  于是,我检查了一下session中的设置发现.  
  ----------------------------------------------------------------------------------  
  已用时间: 00: 00: 00.00  
  SQL> show all  
  appinfo为OFF并且已设置为"SQL*Plus"  
  arraysize 15  
  autocommit OFF  
  autoprint OFF  
  autorecovery OFF  
  autotrace OFF  
  blockterminator "." (hex 2e)  
  btitle OFF and 为下一条 SELECT 语句的前几个字符  
  cmdsep OFF  
  colsep " "  
  compatibility version NATIVE  
  concat "." (hex 2e)  
  copycommit 0  
  COPYTYPECHECK 为 ON  
  define OFF  
  describe DEPTH 1 LINENUM OFF INDENT ON  
  echo OFF  
  editfile "afiedt.buf"  
  embedded OFF  
  escape OFF  
  用于6或更多行的 FEEDBACK ON  
  flagger OFF  
  flush ON  
  heading ON  
  headsep "|" (hex 7c)  
  instance "local"  
  linesize 500  
  lno 9  
  loboffset 1  
  logsource ""  
  long 80  
  longchunksize 80  
  markup HTML OFF HEAD "<style type='text/css'> body {font:10pt Ar  
  newpage 1  
  null ""  
  numformat ""  
  numwidth 10  
  pagesize 14  
  PAUSE 为OFF  
  pno 1  
  recsep WRAP  
  recsepchar " " (hex 20)  
  release 801070400  
  repfooter OFF and 为 NULL  
  repheader OFF and 为 NULL  
  serveroutput OFF  
  shiftinout INVISIBLE  
  showmode OFF  
  spool OFF  
  sqlblanklines OFF  
  sqlcase MIXED  
  sqlcode 0  
  sqlcontinue "> "  
  sqlnumber ON  
  sqlpluscompatibility 8.1.7  
  sqlprefix "#" (hex 23)  
  sqlprompt "SQL> "  
  sqlterminator ";" (hex 3b)  
  suffix "sql"  
  tab ON  
  termout ON  
  time OFF  
  timing ON  
  trimout ON  
  trimspool OFF  
  ttitle OFF and 为下一条 SELECT 语句的前几个字符  
  underline "-" (hex 2d)  
  USER 为"SCOTT"  
  verify ON  
  wrap : 行将为已换行  
  SQL>  
  ----------------------------------------------------------------------------------  
  在上面的输出中,可以看到define参数被设置为on. 后来我从新设置define为off(set define off);  
  重新执行插入语句,运行结果如下:  
  SQL> CREATE TABLE TEST3 (  
  2 ID NUMBER (2) PRIMARY KEY,  
  3 NAME VARCHAR2 (20));  
  表已创建。  
  已用时间: 00: 00: 00.02  
  SQL>  
  SQL> show define  
  define OFF  
  SQL> insert into test3 values(2,'sgs&a&n');  
  已创建 1 行。  
  已用时间: 00: 00: 00.00  
  SQL> select * from test3;  
  ID NAME  
  ---------- ----------------------------------------  
  2 sgs&a&n  
  已用时间: 00: 00: 00.00  
  结果显示,插入'&'字符成功.  
  后来,我又在sqlplus直接运行,居然也成功.后来我检查了一下define的设置,此时为 define on状态.  
  可是为什么却可以插入了.后来又把他设置为off,同样可以插入成功.因为我觉得sqlplus命令行是不支持  
  自定义变量,因此可以插入成功.而sqlplusw支持自定义变量,所以一定要先设置过define off才可以. 
查看本文来源