7
回答
oracle存储过程
华为云实践训练营,热门技术免费实践!>>>   
 就是我想写一个存储过程,anlknz(有2、5、7、9位)2位数字 为10,20,30,5为的前面两位是2位的数字,anlnum是主键、anlstruct是结构,如果5为数字前两位是一样的就把两位数字的主键放到anlstruct字段中,怎么写啊 
举报
共有7个答案 最后回答: 1年前
楼主说的哪国语言,为什么都认识却看不懂
--- 共有 1 条评论 ---
小小小老鼠 就是我想写一个存储过程,anlknz(有2、5、7、9位)2位字符串为'10','20','30',5为的前面两位是2位的字符串,anlnum是主键、anlstruct是结构,例如 5位数字 前两位字符串 和两位字符串的值是一样的 ,就把两位数字的主键放到五位字符串的anlstruct字段中, 1年前 回复
楼主说的哪国语言,为什么都认识却看不懂
--- 共有 4 条评论 ---
小小小老鼠关键是不会写 1年前 回复
LinuxGod回复 @小小小老鼠 : 不管你是什么个意思我觉得你都会用到 decode 和 substr 函数。 1年前 回复
LinuxGod回复 @小小小老鼠 : 说这么多其实你就是想判断第3位和第4位数字是不是相等呗? 1年前 回复
小小小老鼠anlknz里的数字两位的为10 ,20,30 那么五位的为10 111 或者20 111 或者 30 111 七位的 为10 111 12 一次类推 1年前 回复

引用来自“LinuxGod”的评论

楼主说的哪国语言,为什么都认识却看不懂

如果是和我刚才说的一样,你可以这么写:

select f_gzdycode,
       decode(substr(f_gzdycode, 3, 1),
              substr(f_gzdycode, 4, 1),
              '相等',
              '不相等')
  from t_busi_gzdy_tmccl_xz xz
 where f_gzdycode is not null;




引用来自“LinuxGod”的评论

楼主说的哪国语言,为什么都认识却看不懂

引用来自“LinuxGod”的评论

如果是和我刚才说的一样,你可以这么写:

select f_gzdycode,
       decode(substr(f_gzdycode, 3, 1),
              substr(f_gzdycode, 4, 1),
              '相等',
              '不相等')
  from t_busi_gzdy_tmccl_xz xz
 where f_gzdycode is not null;




DECLARE
  CURSOR anl_cur IS
    SELECT * FROM anl FOR UPDATE;
  length1 number;
BEGIN
  open anl_cur;
  fetch anl_cur

    into length1 when anl_cur%FOUND;

  LOOP
    IF length1 = 2 THEN
      update anl a
         set a.anlstruct =
             (select anlnum
                from anl
               where length(anlknz) = 2
                 and anlknz in (select substr(anlknz, 1, 2)
                                  from anl
                                 where length(anlknz) = 5))
       where length(a.anlknz) = 5
         and (select anlknz from anl where length(anlknz) = 2) in
             (select substr(anlknz, 1, 2) from anl where length(anlknz) = 5);


    END IF;
  END LOOP;
  close anl_cur;
END;
ORA-06550: 第 8 行, 第 18 列: 
PLS-00103: 出现符号 "WHEN"在需要下列之一时:
 . ( , % ; limit
ORA-06550: 第 9 行, 第 3 列: 

PLS-00103: 出现符号 "LOOP"

你给看看这语句那里有问题啊


--- 共有 1 条评论 ---
LinuxGod你查查看是不是有全角符号在里面, 空格, 其他的... 1年前 回复
ablknz输入
10
10 111
10 111 22
10 111 22 33




下方sql执行后anlstruct被更新为:
10 111,anlstruct设置为10
10 111 22,anlstruct设置为10 111
10 111 22 33,anlstruct设置为10 111 22




update t a set anlstruct=(select b.anlnum from t b where 
(length(a.ablknz)>5 and substr(a.ablknz,1,length(a.ablknz)-2)=b.ablknz )
 or
 (length(a.ablknz)=5 and substr(a.ablknz,1,2)=b.ablknz)
)
 where exists(select null from t b where 
 (length(a.ablknz)>5 and substr(a.ablknz,1,length(a.ablknz)-2)=b.ablknz )
 or
 (length(a.ablknz)=5 and substr(a.ablknz,1,2)=b.ablknz)
)




如无论多少级别都返回两位数的ID,这SQL要改!!
ablknz输入
10
10 111
10 111 22
10 111 22 33




下方sql执行后anlstruct输出
10 111,anlstruct设置为10
10 111 22,anlstruct设置为10
10 111 22 33,anlstruct设置为10






update t a set anlstruct=(select b.anlnum from t b where 
 substr(a.ablknz,1,2)=b.ablknz
)
 where exists(select null from t b where 
 substr(a.ablknz,1,2)=b.ablknz
)




--- 共有 2 条评论 ---
IdleMan回复 @小小小老鼠 : SQL已经支持你所的情况了,把里面的T表改成你的真实表。A B都是t表的别名而已 1年前 回复
小小小老鼠这里的anlknz两位字符串可能是10,也可能是20,也可能是30,而且你写的a 和 b 他是在一张表 1年前 回复
顶部