这是可能的,但有一些限制,例如.
条形码必须具有相同的格式,因为如果不是这样的话,就没有办法区分哪个是01
,哪个是01
.您的原始(在更改之前)示例条形码说明:
01180120708010531524112910L2238415F9002
-- --
two 01 values; which of them is supposed to represent CODE value?
代码必须紧跟在该示例中的一个后面:01、15、10、90;否则,您无法正确计算长度
SQL> create or replace function f_bc(par_string in varchar2, par_code in varchar2)
2 return varchar2 is
3 l_len_01 number;
4 l_len_10 number;
5 l_len_15 number;
6 l_len_90 number;
7 --
8 l_01 varchar2(20);
9 l_10 varchar2(20);
10 l_15 varchar2(20);
11 l_90 varchar2(20);
12 retval varchar2(20);
13 begin
14 select csize into l_len_01 from barcode_settings where code = '01';
15 select csize into l_len_10 from barcode_settings where code = '10';
16 select csize into l_len_15 from barcode_settings where code = '15';
17 select csize into l_len_90 from barcode_settings where code = '90';
18
19 l_01 := substr(par_string, 3, l_len_01);
20 l_15 := substr(par_string, 2 + l_len_01 + 2 + 1, l_len_15);
21 l_10 := substr(par_string,
22 2 + l_len_01 + 2 + l_len_15 + 2 + 1,
23 length(par_string) - (2 + l_len_01 + 2 + l_len_15 + 2 + 1 + 2 + l_len_90));
24 l_90 := substr(par_string, -2);
25
26 retval := case when par_code = '01' then l_01
27 when par_code = '15' then l_15
28 when par_Code = '10' then l_10
29 when par_code = '90' then l_90
30 end;
31 return retval;
32 end;
33 /
Function created.
测试:
SQL> with test (barcode) as
2 (select '01180120708010531524112910L2238415F9002' from dual)
3 select f_bc(barcode, '01') v_01,
4 f_bc(barcode, '15') v_15,
5 f_bc(barcode, '10') v_10,
6 f_bc(barcode, '90') v_90
7 from test;
V_01 V_15 V_10 V_90
--------------- ------ ---------- -----
18012070801053 241129 L2238415 02
SQL>