0

此代码用于从表 MMSTREPHDR 生成唯一短名称。我已经在 MMSTREPHDR 中有短名称kv, kv1, 。但是在传递参数 kv 时,它给了我 而不是(因为它在循环中)。无法弄清楚出了什么问题?kv2kv3kv1kv4

FUNCTION FUN_GENERATE_SNAME (p_name VARCHAR2)
  RETURN VARCHAR2
IS
  vl_sname   VARCHAR2 (15);
  n_cnt      NUMBER := 1;
  vl_sub     NUMBER;

  CURSOR c1 (vl_sname VARCHAR2)
  IS
     SELECT   a.repsname, a.repcode
       FROM   MMSTREPHDR a
      WHERE   TRIM (UPPER (a.repsname)) = TRIM (UPPER (vl_sname));
BEGIN
  vl_sname := TRIM (SUBSTR (p_name, 1, 15));

  FOR i IN c1 (vl_sname)
  LOOP
     vl_sub := LENGTH (TO_CHAR (n_cnt));
     vl_sname := SUBSTR (vl_sname, 1, (15 - vl_sub)) || n_cnt;
     n_cnt := n_cnt + 1;
  END LOOP;

  RETURN vl_sname;
EXCEPTION
  WHEN OTHERS
  THEN
     RETURN vl_sname;
END fun_generate_sname;
4

3 回答 3

1

你的起始参数是'kv'。这就是您传递给光标的内容。因此,您的光标将选择一行,即所在的行MMSTREPHD.repsname = 'kv'

所以你的循环逻辑将被执行一次。所以cnt= . Hencevl_sname` 变成了 'kv1',这是你在循环干净退出时得到的值。


解决此问题的最简单方法是承认这MMSTREPHD.repsname是一个智能密钥,由两个元素组成:子系统名称和报告编号。将列拆分为两列将使查找给定子系统的下一个报告编号变得轻而易举。您甚至可以将复合值保留为虚拟列(11g 或更高版本),或者使用有点糟糕的触发器来维护它。

否则:

 select concat(p_name
             , trim(to_char(max(to_number(nvl(replace(repsname,p_name),'0')))+1)) )
 into vl_sname
 from MMSTREPHD
 where repsname like p_name||'%'

警告 - 我还没有测试过这个(还)所以括号可能无法正确配对。

于 2013-07-26T09:09:08.853 回答
0

试试这个功能

function FUN_GENERATE_SNAME(p_name varchar2) return varchar2 is
    l_idx     number;
    l_name_ln := length(trim(p_name));
begin
    select max(substr(trim(UPPER(a.repsname)), 1, -length(trim(UPPER(a.repsname)) + l_name_ln)) 
      into l_idx 
      from MMSTREPHDR a 
     where substr(trim(UPPER(a.repsname)), 1, l_name_ln) = trim(UPPER(vl_sname));

    if l_idx is null then
        -- mean name is unique
        return vl_sname;
    else
        return vl_sname ||(l_idx + 1);
    end if;
exception
    when others then
        return vl_sname;
end fun_generate_sname;
于 2013-07-26T13:13:27.170 回答
0

您将以下语句连接为

  vl_sname := SUBSTR (vl_sname, 1, (15 - vl_sub)) || n_cnt;

这里 n_cnt 在上面的代码中被赋予初始值为 1,这就是为什么它获取你的值作为 KV1。你应该保持它为空,并且 after 语句应该在循环中将它增加 1。希望会有用

于 2013-07-26T07:44:02.140 回答