update a set s2=substrb(s1,1,30) 试试 可能是s1里包含了汉字或其他双字节的字符
那么你需要将s2长度扩大 至少和s1一样大 alter table a modify s2 varchar(40)
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里演示一遍?
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楼一针见血
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>
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。
另外,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>
请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.
对于大家讲的 字符字节,substr,substrb用法,我也清楚,可能是我问题没描述清楚, 请用上楼的sql建表后,清空字段二,再用update set 字段二到建表时的数据.
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,个么用之。
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> 怎么说?
试试
可能是s1里包含了汉字或其他双字节的字符
至少和s1一样大
alter table a modify s2 varchar(40)
----------
40SQL> update a set s2=substr(s1,1,30);已更新 1 行。SQL> commit
2 ;提交完成。SQL> select * from a;S1 S2
---------------------------------------- ------------------------------
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSQL>把你的操作在sqlplus里演示一遍?
---------------------------------------- ------------------------------
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楼一针见血
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>
---------------------------------------- ------------------------------
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。
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>
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.
请用上楼的sql建表后,清空字段二,再用update set 字段二到建表时的数据.
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,个么用之。
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>
怎么说?