请教,关于更新字段中某一位值的问题。

danna 2004-12-26 11:21:19
有谁知道在ORALCE ,怎么把某一编号中的某一位更改。如4305216701003,中的第九、十更换成03,注意这种记录是很多的。 另外这编号是具有唯一性,意思是如果01换成03时有可能主键冲突。这时,可以更换后面的流水号003,以保证唯一。
...全文
182 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
danna 2004-12-29
  • 打赏
  • 举报
回复
to ATGC(想到南极去看看飞翔的海鸥)

非常谢谢!辛苦了!!
ATGC 2004-12-28
  • 打赏
  • 举报
回复
表数据如下,现在把第9,10位都改成03,原来是03的不改。原来不是03的遵循空号优先,小号优先的原则进行选号。。祝楼主好运。。俺也得sleep了。。

SQL> select * from aa;

BH
-------------
1234567803001
1234567803003
1234567803004
1234567803005
1234567801001
1234567801009

已选择6行。

create or replace procedure test(position_9_10 in char)
as
type my_cursor is ref cursor;
my_all_record my_cursor;
my_each_record my_cursor;
every_record varchar2(13);
every_bh varchar2(10);
prior_record char(3);
next_record char(3);
last3 char(3);
sqlstr varchar2(100);
begin
sqlstr := 'select bh from aa where substrb(bh,9,2)!='''||position_9_10||'''';
open my_all_record for sqlstr;
loop
fetch my_all_record into every_record;
exit when my_all_record%notfound;
every_bh := substrb(every_record,1,8)||position_9_10;
last3 := '';
sqlstr := 'select substrb(bh,11,3) from aa where substrb(bh,1,10)='''||every_bh||''' order by bh';
open my_each_record for sqlstr;
fetch my_each_record into prior_record;
if my_each_record%notfound then
last3:='001';
else
if to_number(prior_record)>=2 then
last3:='001';
else
while my_each_record%rowcount<=999 loop
last3:=to_char(my_each_record%rowcount);
fetch my_each_record into next_record;
if my_each_record%rowcount=to_number(last3) then
if my_each_record%rowcount=999 then
last3:='000';
else
last3:=to_char(my_each_record%rowcount+1);
end if;
exit;
else
if to_number(next_record)!=to_number(prior_record)+1 then
last3:=to_char(to_number(prior_record)+1);
exit;
else
prior_record:=next_record;
end if;
end if;
end loop;
end if;
end if;
if to_number(last3)<10 then
last3:=concat('00',to_number(last3));
elsif to_number(last3)<100 then
last3:=concat('0',to_number(last3));
end if;
close my_each_record;
update aa set bh=every_bh||last3 where bh=every_record;
commit;
end loop;
close my_all_record;
end;
/

过程已创建

SQL> exec test('03');

PL/SQL 过程已成功完成。

SQL> select * from aa;

BH
-------------
1234567803001
1234567803003
1234567803004
1234567803005
1234567803002
1234567803006

已选择6行。

此时原来的
1234567801001
1234567801009
已分别被改成了
1234567803002
1234567803006
把那个空号002也用了,然后如果都排满了,就用最大的005加1等于006
wupangzi 2004-12-27
  • 打赏
  • 举报
回复
楼主,可以先忽略第九、十两位,如果有重复则更新最后流水号!然后回头改第九、十位!这样就KO了!
ORARichard 2004-12-27
  • 打赏
  • 举报
回复
最后的三位也不能随便改
----------------

那原来编号最后三位的值是以后要在其它地方有用,还是只要保证其唯一。
如果是在其它地方有用,那么即使改成原最大编号值+1,还是会有问题。
如果是为了保证唯一性。那么上面的方法足以
ORARichard 2004-12-27
  • 打赏
  • 举报
回复
create sequence s start with 1 maxvalue 999;

update 表 set 编号=substr(编号,1,8)||'03'||substr(to_char(1000+s.nextval),2,3)
where substr(编号,9,2)='01';

drop sequence s;
danna 2004-12-27
  • 打赏
  • 举报
回复
TO ORARichard(没钱的日子......)

 最后的三位也不能随便改,要找到改完后的最大编号,再在最大编号上加1生成就是.
bzszp 2004-12-27
  • 打赏
  • 举报
回复
update语句+触发器
danna 2004-12-27
  • 打赏
  • 举报
回复
to 楼上的..

 不能先忽略第9,十位.要先更新完了第9,10位,再更新后面的流水号.如果更新后的编号有重复再更新流水号.这具体怎么写呀.不懂..
ATGC 2004-12-26
  • 打赏
  • 举报
回复
方便一点,也可以挑一个肯定没有的流水号。

update table set field=substrb(field,1,8)||'03000';

update table set field=substrb(field,1,8)||'03999';

ATGC 2004-12-26
  • 打赏
  • 举报
回复
以下语句没有考虑主键冲突,可以自己写个程序判断
update table set field=substrb(field,1,8)||'03'||substrb(11,3);
ORARichard 2004-12-26
  • 打赏
  • 举报
回复
楼主,既然最后三位能改。
不如将9,10和最后三位一起改掉,这样一句SQL就可以搞定了(最后三位用序列)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧