---如果更新下面的备注信息
create table test1(
seq_no number(10),  -- 序号
type1   char(1),   --- 类型1
type2   char(4), --类型2
amt    number(10,2),  --金额
   char(6)); --备注    前4位为 从1递增的序列 不足4位,前补0
--第五位 为 页数 每两条记录为一页  依次递增 如果大于9的话,直接赋值为9
--第六位 为总页数  该类型的总条数/2  小数点采用进一法
请实现下如何更新 信息
seq_no type1 type2 amt
1 1 1001 100 000114
3 1 1001 100 000114
4 1 1001 100 000124
5 1 1001 100 000124
6 1 1001 100 000134
7 1 1001 100 000134
8 1 1001 100 000144
9 1 1002 100 000212
10 1 1002 100 000212
11 1 1002 100 000222
12 1 1002 100 000222
13 2 1001 100 000111
14 2 1001 100 000111
15 2 1002 100 000213
16 2 1002 100 000213
17 2 1002 100 000223
18 2 1002 100 000223
19 2 1002 100 000233
20 2 1003 100 000116
21 2 1003 100 000116
22 2 1003 100 000126
23 2 1003 100 000126
24 2 1003 100 000136
25 2 1003 100 000136
26 2 1003 100 000146
27 2 1003 100 000146
28 2 1003 100 000156
29 2 1003 100 000156
30 2 1003 100 000116

解决方案 »

  1.   

    描述的不大明白 不好意思 ,我再描述下一、首先 描述下表结构
    create table test1( 
    seq_no number(10),  
    type1 char(1),
    type2 char(4), 
    amt number(10,2),
     char(6)); 
    详细说明:
    seq_no -- 序号
    type1  --- 类型1 
    type2 --类型2 
    amt  --金额 
    --备注共有6位字符 其中
           前4位为 从1递增的序列 不足4位,前补0 
          第五位 为 页数 每两条记录为一页 依次递增 如果大于9的话,直接赋值为9 
          第六位 为总页数 该类型的总条数/2 小数点采用进一法 二、描述需要做的事情
       上述一得表结构中 前4个字段
       seq_no -- 序号
       type1  --- 类型1 
       type2 --类型2 
       amt  --金额
       中有数据,现在需要写一个update语句
       根据前4个字段,来更新 字段
    三、表中数据数据  以及需要更新上去的内容
    seq_no type1 type2 amt 需要更新到上的值
    1 1 1001 100 000114
    3 1 1001 100 000114
    4 1 1001 100 000124
    5 1 1001 100 000124
    6 1 1001 100 000134
    7 1 1001 100 000134
    8 1 1001 100 000144
    9 1 1002 100 000212
    10 1 1002 100 000212
    11 1 1002 100 000222
    12 1 1002 100 000222
    13 2 1001 100 000111
    14 2 1001 100 000111
    15 2 1002 100 000213
    16 2 1002 100 000213
    17 2 1002 100 000223
    18 2 1002 100 000223
    19 2 1002 100 000233
    20 2 1003 100 000116
    21 2 1003 100 000116
    22 2 1003 100 000126
    23 2 1003 100 000126
    24 2 1003 100 000136
    25 2 1003 100 000136
    26 2 1003 100 000146
    27 2 1003 100 000146
    28 2 1003 100 000156
    29 2 1003 100 000156
    30 2 1003 100 000116
    这样描述可以吗 ?
      

  2.   

      --前4位为 从1递增的序列 不足4位,前补0  
    这个跟seq_no, type1, type2, amt有什么关系吗?
     根据seq_no, type1, type2, amt取值规则不清晰啊
    第六位 为总页数 该类型的总条数(指的是?)/2 小数点采用进一法  
      

  3.   

     type1, type2相同数据的总条数
      

  4.   

    比如
    seq_no type1 type2 amt  需要更新到上的值
    1 1 1001 100 000114
    3 1 1001 100 000114
    4 1 1001 100 000124
    5 1 1001 100 000124
    6 1 1001 100 000134
    7 1 1001 100 000134
    8 1 1001 100 000144类型1 为1 类型2为1001 的数据总条数是8条  每页2条 第六位总页数赋值为4
      

  5.   


    不好意思刚才没有看清楚,现在重新回复下 谢谢你的关注
    --前4位为 从1递增的序列 不足4位,前补0  
    这个跟seq_no, type1, type2, amt有什么关系吗?===》 对前4位来说,类型1相同,类型2不同的数据  从1递增
           也就是说 随着类型2的变化 递增      
           类型1变化后 前4位 重新变成从1开始
           seq_no type1 type2 amt 需要更新到上的值       1 1 1001 100 000114
          3 1 1001 100 000114
          8 1 1001 100 000144
          9 1 1002 100 000212
          10 1 1002 100 000212
          13 2 1001 100 000111
          14 2 1001 100 000111
          15 2 1002 100 000213
          16 2 1002 100 000213       这个可以不用考虑 --这个我可以实现对于第五位的值来说 seq_no type1 type2 amt  需要更新到上的值
    1 1 1001 100 000114
    3 1 1001 100 000114
    4 1 1001 100 000124
    5 1 1001 100 000124
    6 1 1001 100 000134
    7 1 1001 100 000134
    8 1 1001 100 000144第五位为1 表示第一页
    1 1 1001 100 000114
    3 1 1001 100 000114
    第五位为2 表示第二页
    4 1 1001 100 000124
    5 1 1001 100 000124
    第五位为3 表示第三页
    6 1 1001 100 000134
    7 1 1001 100 000134
    第五位为4 表示第四页
    8 1 1001 100 000144类型1 为1 类型2为1001 的数据总条数是8条 每页2条 第六位总页数赋值为4
      

  6.   

    谢谢你的关注现在是在plsql 中实现,  因为性能的考虑 ,想尽量批量更新!
      

  7.   


    批量更新,采用cusor一样可以啊
      

  8.   


    create  or replace procedure pro_update
    is
    --定义cursor和结果变量rs:
    cursor cur is select * from tab for update;
    rs tab%rowtype;
    begin
      open cur; 
      loop
         fetch cursor into rs ;
         exit when cursor%notfound;
         --在这里面进行判断,作相应的处理,并更新该循环里的那笔资料
         --可以通过控制语句来实现的更新目的
         ....
         ....
    end loop;
      commit;
    end;
      

  9.   

    SQL> select * from test1;
     
         SEQ_NO TYPE1 TYPE2          AMT MARK
    ----------- ----- ----- ------------ ------
              1 1     1001        100.00 
              3 1     1001        100.00 
              4 1     1001        100.00 
              5 1     1001        100.00 
              6 1     1001        100.00 
              7 1     1001        100.00 
              8 1     1001        100.00 
              9 1     1002        100.00 
             10 1     1002        100.00 
             11 1     1002        100.00 
             12 1     1002        100.00 
             13 2     1001        100.00 
             14 2     1001        100.00 
             15 2     1002        100.00 
             16 2     1002        100.00 
             17 2     1002        100.00 
             18 2     1002        100.00 
             19 2     1002        100.00 
             20 2     1003        100.00 
             21 2     1003        100.00 
     
         SEQ_NO TYPE1 TYPE2          AMT MARK
    ----------- ----- ----- ------------ ------
             22 2     1003        100.00 
             23 2     1003        100.00 
             24 2     1003        100.00 
             25 2     1003        100.00 
             26 2     1003        100.00 
             27 2     1003        100.00 
             28 2     1003        100.00 
             29 2     1003        100.00 
             30 2     1003        100.00 
     
    29 rows selected
     
    SQL> 
    SQL> select seq_no,type1,type2,amt,lpad(dense_rank()over(partition by type1 order by type2 ),4,'0')||
      2  case when ceil( row_number()over(partition by type1,type2 order by seq_no)/2)>9 then 9 else ceil( row_number()over(partition by type1,type2 order by seq_no)/2) end ||
      3  case when ceil(count(*)over(partition by type1,type2)/2)>9 then 9 else ceil(count(*)over(partition by type1,type2)/2) end
      4   from test1;
     
         SEQ_NO TYPE1 TYPE2          AMT LPAD(DENSE_RANK()OVER(PARTITIO
    ----------- ----- ----- ------------ --------------------------------------------------------------------------------
              1 1     1001        100.00 000114
              3 1     1001        100.00 000114
              4 1     1001        100.00 000124
              5 1     1001        100.00 000124
              6 1     1001        100.00 000134
              7 1     1001        100.00 000134
              8 1     1001        100.00 000144
              9 1     1002        100.00 000212
             10 1     1002        100.00 000212
             11 1     1002        100.00 000222
             12 1     1002        100.00 000222
             13 2     1001        100.00 000111
             14 2     1001        100.00 000111
             15 2     1002        100.00 000213
             16 2     1002        100.00 000213
             17 2     1002        100.00 000223
             18 2     1002        100.00 000223
             19 2     1002        100.00 000233
             20 2     1003        100.00 000316
             21 2     1003        100.00 000316
     
         SEQ_NO TYPE1 TYPE2          AMT LPAD(DENSE_RANK()OVER(PARTITIO
    ----------- ----- ----- ------------ --------------------------------------------------------------------------------
             22 2     1003        100.00 000326
             23 2     1003        100.00 000326
             24 2     1003        100.00 000336
             25 2     1003        100.00 000336
             26 2     1003        100.00 000346
             27 2     1003        100.00 000346
             28 2     1003        100.00 000356
             29 2     1003        100.00 000356
             30 2     1003        100.00 000366
     
    29 rows selected
     
    SQL> 看看这样成不
      

  10.   

    不过,我看到单纯的SQL中,含有那么多判断以及控制,我就不想整了!佩服你的意志了 minitoy!
    向你学习啊
      

  11.   

    谢谢 各位帅哥 美女们的帮助,特别感谢14楼minitoy(在水一方) 帮助。