oracle 中表a的两个字段
s1 varchar(40),
s2 varchar(30),
用update a set s2=substr(s1,1,30),
报插入的值对于列过大错误,有大大知道什么问题吗?
需表的话请QQ:83496185

解决方案 »

  1.   

    update a set s2=substrb(s1,1,30)
    试试
    可能是s1里包含了汉字或其他双字节的字符
      

  2.   

    那么你需要将s2长度扩大
    至少和s1一样大
    alter table a modify s2 varchar(40)
      

  3.   

    SQL> create table a (s1 varchar(40), s2 varchar(30));表已创建。SQL> insert into a (s1) values ('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');已创建 1 行。SQL> commit;提交完成。SQL> select length(s1) from a;LENGTH(S1)
    ----------
            40SQL> update a set s2=substr(s1,1,30);已更新 1 行。SQL> commit
      2  ;提交完成。SQL> select * from a;S1                                       S2
    ---------------------------------------- ------------------------------
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSQL>把你的操作在sqlplus里演示一遍?
      

  4.   

    SQL> insert into a (s1) values ('a噶杀风景电功率飞机了风格发挥广泛广泛渥b');已创建 1 行。SQL> commit;提交完成。SQL> select * from a;S1                                       S2
    ---------------------------------------- ------------------------------
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    a噶杀风景电功率飞机了风格发挥广泛广泛渥bSQL> select length(s1) from a;LENGTH(S1)
    ----------
            40
            21SQL> update a set s2=substr(s1,1,30),;
    update a set s2=substr(s1,1,30),
                                   *
    第 1 行出现错误:
    ORA-01747: user.table.column, table.column 或列说明无效
    SQL> update a set s2=substr(s1,1,30);
    update a set s2=substr(s1,1,30)
                    *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."A"."S2" 的值太大 (实际值: 40, 最大值: 30)
    SQL> update a set s2=substr(s1,1,31);
    update a set s2=substr(s1,1,31)
                    *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."A"."S2" 的值太大 (实际值: 31, 最大值: 30)
    SQL> update a set s2=substr(s1,1,29);
    update a set s2=substr(s1,1,29)
                    *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."A"."S2" 的值太大 (实际值: 40, 最大值: 30)
    SQL> update a set s2=substr(s1,1,20);
    update a set s2=substr(s1,1,20)
                    *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."A"."S2" 的值太大 (实际值: 39, 最大值: 30)
    SQL> update a set s2=substr(s1,1,19);
    update a set s2=substr(s1,1,19)
                    *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."A"."S2" 的值太大 (实际值: 37, 最大值: 30)
    SQL> update a set s2=substr(s1,1,11);已更新2行。SQL> update a set s2=substr(s1,1,15);已更新2行。SQL> update a set s2=substr(s1,1,17);
    update a set s2=substr(s1,1,17)
                    *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."A"."S2" 的值太大 (实际值: 33, 最大值: 30)
    SQL>
    1楼一针见血
      

  5.   

    Connected to Oracle9i Release 9.2.0.1.0 
    Connected as cw10
     
    SQL> desc test
    Name       Type         Nullable Default Comments 
    ---------- ------------ -------- ------- -------- 
    SMATLPCODE VARCHAR2(40) Y                         
    SIMAGE     VARCHAR2(30) Y                         
     
    SQL> update test set simage = substr(smatlpcode,1,30)
      2  /
     
    update test set simage = substr(smatlpcode,1,30)
     
    ORA-01401: 插入的值对于列过大
     
    SQL> 
      

  6.   

    SQL> create table a (s1 varchar(40), s2 varchar(30));表已创建。SQL> insert into a (s1) values ('a噶杀风景电功率飞机了风格发挥广泛广泛渥b');已创建 1 行。SQL> commit;提交完成。SQL> select * from a;S1                                       S2
    ---------------------------------------- ------------------------------
    a噶杀风景电功率飞机了风格发挥广泛广泛渥bSQL> select length(s1) from a;LENGTH(S1)
    ----------
            21SQL> select lengthb(s1) from a;LENGTHB(S1)
    -----------
             40SQL> select substr(s1,1,30) from a;SUBSTR(S1,1,30)
    ------------------------------------------------------------
    a噶杀风景电功率飞机了风格发挥广泛广泛渥bSQL> select substr(s1,1,15) from a;SUBSTR(S1,1,15)
    ------------------------------
    a噶杀风景电功率飞机了风格发挥SQL> select length('a噶杀风景电功率飞机了风格发挥') from dual;LENGTH('A噶杀风景电功率飞机了风格发挥')
    ---------------------------------------
                                         15SQL> select lengthb('a噶杀风景电功率飞机了风格发挥') from dual;LENGTHB('A噶杀风景电功率飞机了风格发挥')
    ----------------------------------------
                                          29SQL> update a set s2=substr(s1,1,15);已更新 1 行。SQL> update a set s2=substr(s1,1,16);
    update a set s2=substr(s1,1,16)
                    *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."A"."S2" 的值太大 (实际值: 31, 最大值: 30)
    SQL>可以看出,substr取的是字符数,不是字节数(lengthb返回的)。substr(s1,1,30),字节数可能大于30。
      

  7.   

    另外,ORACLE建议使用VARCHAR2,别用VARCHAR。为了向以后兼容,最好使用VARCHAR2。如果你要避免这样的情况,定义s2(30 char)试试。
    SQL> create table a (s1 varchar(40), s2 varchar(30));表已创建。SQL> insert into a (s1) values ('a噶杀风景电功率飞机了风格发挥广泛广泛渥b');已创建 1 行。SQL> commit;提交完成。SQL> select * from a;S1                                       S2
    ---------------------------------------- ------------------------------
    a噶杀风景电功率飞机了风格发挥广泛广泛渥bSQL> select length(s1) from a;LENGTH(S1)
    ----------
            21SQL> select lengthb(s1) from a;LENGTHB(S1)
    -----------
             40SQL> select substr(s1,1,30) from a;SUBSTR(S1,1,30)
    ------------------------------------------------------------
    a噶杀风景电功率飞机了风格发挥广泛广泛渥bSQL> select substr(s1,1,15) from a;SUBSTR(S1,1,15)
    ------------------------------
    a噶杀风景电功率飞机了风格发挥SQL> select length('a噶杀风景电功率飞机了风格发挥') from dual;LENGTH('A噶杀风景电功率飞机了风格发挥')
    ---------------------------------------
                                         15SQL> select lengthb('a噶杀风景电功率飞机了风格发挥') from dual;LENGTHB('A噶杀风景电功率飞机了风格发挥')
    ----------------------------------------
                                          29SQL> update a set s2=substr(s1,1,15);已更新 1 行。SQL> update a set s2=substr(s1,1,16);
    update a set s2=substr(s1,1,16)
                    *
    第 1 行出现错误:
    ORA-12899: 列 "SCOTT"."A"."S2" 的值太大 (实际值: 31, 最大值: 30)
    SQL> drop table a purge;表已删除。SQL> create table a (s1 varchar(40), s2 varchar(30 char));表已创建。SQL> insert into a (s1) values ('a噶杀风景电功率飞机了风格发挥广泛广泛渥b');已创建 1 行。SQL> commit;提交完成。SQL> select * from a;S1
    ----------------------------------------
    S2
    ------------------------------------------------------------
    a噶杀风景电功率飞机了风格发挥广泛广泛渥bSQL> update a set s2=substr(s1,1,30);已更新 1 行。SQL> commit;提交完成。SQL> select * from a;S1
    ----------------------------------------
    S2
    ------------------------------------------------------------
    a噶杀风景电功率飞机了风格发挥广泛广泛渥b
    a噶杀风景电功率飞机了风格发挥广泛广泛渥b
    SQL>
      

  8.   

    请update字段二到建表时的数据prompt PL/SQL Developer import file
    prompt Created on 2010年2月9日 星期二 by Administrator
    set feedback off
    set define off
    prompt Creating TEST...
    create table TEST
    (
      SMATLPCODE VARCHAR2(40),
      SIMAGE     VARCHAR2(30)
    )
    ;prompt Deleting TEST...
    delete from TEST;
    commit;
    prompt Loading TEST...
    insert into TEST (SMATLPCODE, SIMAGE)
    values ('000B047/049/016/16020002*2/16010064', '000B047/049/016/16020002*2/160');
    insert into TEST (SMATLPCODE, SIMAGE)
    values ('注意登录到对于的帐套替换以下单位编号和名', '注意登录到对于的帐套替换以下单');
    commit;
    prompt 2 records loaded
    set feedback on
    set define on
    prompt Done.
      

  9.   

    对于大家讲的 字符字节,substr,substrb用法,我也清楚,可能是我问题没描述清楚,
    请用上楼的sql建表后,清空字段二,再用update set 字段二到建表时的数据.
      

  10.   

    SQL> create table TEST
      2  (
      3    SMATLPCODE VARCHAR2(40),
      4    SIMAGE    VARCHAR2(30)
      5  ) ;表已创建。SQL> insert into TEST (SMATLPCODE, SIMAGE)
      2  values ('注意登录到对于的帐套替换以下单位编号和名', '注意登录到对于的帐套替
    换以下单');已创建 1 行。SQL> commit;提交完成。SQL> select * from test;SMATLPCODE                               SIMAGE
    ---------------------------------------- ------------------------------
    注意登录到对于的帐套替换以下单位编号和名 注意登录到对于的帐套替换以下单SQL> update test set SIMAGE=null;已更新 1 行。SQL> commit;提交完成。SQL> select * from test;SMATLPCODE                               SIMAGE
    ---------------------------------------- ------------------------------
    注意登录到对于的帐套替换以下单位编号和名SQL> update test set SIMAGE=substrb(SMATLPCODE,1,30);已更新 1 行。SQL> commit;提交完成。SQL> select * from test;SMATLPCODE                               SIMAGE
    ---------------------------------------- ------------------------------
    注意登录到对于的帐套替换以下单位编号和名 注意登录到对于的帐套替换以下单SQL>
    既然清楚substrb,个么用之。
      

  11.   

    SQL> create table TEST
      2  (
      3    SMATLPCODE VARCHAR2(40),
      4    SIMAGE    VARCHAR2(30)
      5  )
      6  ;表已创建。SQL> insert into TEST (SMATLPCODE, SIMAGE)
      2  values ('000B047/049/016/16020002*2/16010064', '000B047/049/016/16020002*2/
    160');已创建 1 行。SQL> insert into TEST (SMATLPCODE, SIMAGE)
      2  values ('注意登录到对于的帐套替换以下单位编号和名', '注意登录到对于的帐套替
    换以下单');已创建 1 行。SQL> commit;提交完成。SQL> select * from test;SMATLPCODE                               SIMAGE
    ---------------------------------------- ------------------------------
    000B047/049/016/16020002*2/16010064      000B047/049/016/16020002*2/160
    注意登录到对于的帐套替换以下单位编号和名 注意登录到对于的帐套替换以下单SQL> update test set SIMAGE=null;已更新2行。SQL> commit;提交完成。SQL> select * from test;SMATLPCODE                               SIMAGE
    ---------------------------------------- ------------------------------
    000B047/049/016/16020002*2/16010064
    注意登录到对于的帐套替换以下单位编号和名SQL> update test set SIMAGE=substrb(SMATLPCODE,1,30);已更新2行。SQL> commit;提交完成。SQL> select * from test;SMATLPCODE                               SIMAGE
    ---------------------------------------- ------------------------------
    000B047/049/016/16020002*2/16010064      000B047/049/016/16020002*2/160
    注意登录到对于的帐套替换以下单位编号和名   注意登录到对于的帐套替换以下单SQL>
    怎么说?