每年如何返回01交易号

时间:2019-02-25 09:31:13

标签: oracle plsql

我尝试每年退还交易号01,但失败了。这是我使用的过程。

找到最后一笔交易:

SELECT   COUNT (NOKAS) AS JUMLAH
  INTO   V_JML_RECORD
  FROM   D_MSTHEADER_UKERJA
 WHERE   KTRASL = V_KDKTR;

每笔交易会将+1加到NOKAS:

IF ( V_JML_RECORD = 0)
THEN
   V_JML_RECORD := 1;
ELSE
   V_JML_RECORD := V_JML_RECORD + 1;
END IF;

V_NOKAS := V_JML_RECORD;
IF LENGTH (V_JML_RECORD) = 1
THEN
    V_NOKAS_SBL_REKON := '000' || V_JML_RECORD;
END IF;
IF LENGTH (V_JML_RECORD) = 2
THEN
    V_NOKAS_SBL_REKON := '00' || V_JML_RECORD;
END IF;
IF LENGTH (V_JML_RECORD) = 3
THEN
    V_NOKAS_SBL_REKON := '0' || V_JML_RECORD;
END IF;
IF LENGTH (V_JML_RECORD) = 4
THEN
    V_NOKAS_SBL_REKON := V_JML_RECORD;
END IF;

格式化号码交易:

      || P_BULANTHNSKRG (MMYY)
      || '-'
      || V_NOKAS_SBL_REKON
      || '-'
      || 'PK';

1 个答案:

答案 0 :(得分:0)

这部分不需要IF逻辑:

IF ( V_JML_RECORD = 0)
THEN
    V_JML_RECORD := 1;
ELSE
    V_JML_RECORD := V_JML_RECORD + 1;
END IF;

因为第二个分支无论如何都会处理零;因此您只需要执行一条语句即可:

V_JML_RECORD := V_JML_RECORD + 1;

然后,您可以使用一个单独的格式化命令来替换在逻辑上添加多个零的逻辑:

V_NOKAS := TO_CHAR(V_JML_RECORD, 'FM0000');

格式模型中的四个零表示数字1成为字符串'0001',使用FM格式修饰符可抑制默认情况下允许使用标称+/-符号的前导空格。

您也可以在查询中完成所有操作,具体取决于您需要原始值还是仅使用它来计算最终字符串:

SELECT TO_CHAR(COUNT(NOKAS) + 1), 'FM0000')
INTO V_NOKAS_SBL_REKON
FROM D_MSTHEADER_UKERJA
WHERE KTRASL = V_KDKTR;

或者如果您需要其他事物的中间值,则可以全部获得:

SELECT COUNT(NOKAS), COUNT(NOKAS) + 1, TO_CHAR(COUNT(NOKAS) + 1), 'FM0000')
INTO V_JML_RECORD, V_NOKAS, V_NOKAS_SBL_REKON
FROM D_MSTHEADER_UKERJA
WHERE KTRASL = V_KDKTR;