dwd_abc实现

如题所示,本文为dwd_abc实现,但是大量的代码

交易日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR1 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '202201%';
IN_DEFSTR1 VARCHAR2 ( 128 );--存储变量
OUT_DEFSTR1 DATE;--结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR1;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

OUT_DEFSTR1:=TO_DATE(IN_DEFSTR1,'YYYYMMDD');
END LOOP;
CLOSE C_ABC;
END;

交易时间

交易时间为hh:mi:ss类型的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR2 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '202201%';
IN_DEFSTR2 VARCHAR2( 128 );--存储变量
OUT_DEFSTR2 VARCHAR2( 128 );--结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR2;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

CASE LENGTH(IN_DEFSTR2)
WHEN 6 THEN
OUT_DEFSTR2:=SUBSTR(IN_DEFSTR2, 1, 2) || ':' || SUBSTR(IN_DEFSTR2, 3, 2) || ':' ||SUBSTR(IN_DEFSTR2, 5, 2);
WHEN 5 THEN
OUT_DEFSTR2:='0' || SUBSTR(IN_DEFSTR2, 1, 1) || ':' || SUBSTR(IN_DEFSTR2, 2, 2) || ':' ||
SUBSTR(IN_DEFSTR2, 4, 2);
ELSE
OUT_DEFSTR2:='00:00:00';
END CASE;
END LOOP;
CLOSE C_ABC;
END;

余额

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR5 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '202201%';
IN_DEFSTR3 VARCHAR2( 128 );--存储变量
OUT_DEFSTR3 NUMBER(12,2);--结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR3;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

OUT_DEFSTR3:= TO_NUMBER(IN_DEFSTR3);
DBMS_OUTPUT.put_line(OUT_DEFSTR3);
END LOOP;
CLOSE C_ABC;
END;

交易金额

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR4 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '202201%';
IN_DEFSTR4 VARCHAR2( 128 );--存储变量
OUT_DEFSTR4 NUMBER(12,2);--结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR4;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

OUT_DEFSTR4:= ABS(TO_NUMBER(IN_DEFSTR4));
DBMS_OUTPUT.put_line(OUT_DEFSTR4);
END LOOP;
CLOSE C_ABC;
END;

收支方向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR4 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '202201%';
IN_DEFSTR5 VARCHAR2( 128 );--存储变量
OUT_DEFSTR5 VARCHAR2( 128 );--结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR5;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;
IF SUBSTR(IN_DEFSTR5,1,1)='-' THEN
OUT_DEFSTR5:='支出';
ELSE
OUT_DEFSTR5:='收入';
END IF;
DBMS_OUTPUT.put_line(OUT_DEFSTR5);
END LOOP;
CLOSE C_ABC;
END;

币种

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR4 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '202201%';
IN_DEFSTR6 VARCHAR2( 128 );--存储变量
OUT_DEFSTR6 VARCHAR2( 128 );--结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR6;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

OUT_DEFSTR6:='CNY';
DBMS_OUTPUT.put_line(OUT_DEFSTR6);
END LOOP;
CLOSE C_ABC;
END;

交易本方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR4 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '202201%';
IN_DEFSTR7 VARCHAR2( 128 );--存储变量
OUT_DEFSTR7 VARCHAR2( 128 );--结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR7;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

OUT_DEFSTR7:='ABC';
DBMS_OUTPUT.put_line(OUT_DEFSTR7);
END LOOP;
CLOSE C_ABC;
END;

交易对方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR3,DEFSTR6 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '20221%';
IN_DEFSTR8 VARCHAR2( 128 );--存储变量
OUT_DEFSTR8 VARCHAR2( 128 );--结果变量

--过渡变量
S1 VARCHAR2 ( 128 );
S2 VARCHAR2 ( 128 );
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR8,S1;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

IF IN_DEFSTR8='支付宝' THEN
OUT_DEFSTR8:='ALI';
ELSIF IN_DEFSTR8='财付通' THEN
OUT_DEFSTR8:='TENCE';
ELSIF IN_DEFSTR8='微信支付' THEN
OUT_DEFSTR8:='TENCE';
ELSIF IN_DEFSTR8='平安付科' THEN
OUT_DEFSTR8:='交行信用卡';
ELSIF IN_DEFSTR8='代收业务' THEN
OUT_DEFSTR8:='交行信用卡';
ELSIF IN_DEFSTR8='消费' AND SUBSTR(S1,1,3)='财付通' THEN
OUT_DEFSTR8:='TENCE';
ELSIF IN_DEFSTR8='银联入账' AND SUBSTR(S1,1,3)='财付通' THEN
OUT_DEFSTR8:='TENCE';
ELSIF IN_DEFSTR8='退货' AND SUBSTR(S1,1,3)='财付通' THEN
OUT_DEFSTR8:='TENCE';
ELSIF IN_DEFSTR8='代付' AND SUBSTR(S1,1,3)='财付通' THEN
OUT_DEFSTR8:='TENCE';
ELSIF IN_DEFSTR8='代付' AND SUBSTR(S1,1,3)='支付宝' THEN
OUT_DEFSTR8:='ALI';
ELSE OUT_DEFSTR8:='未知';
END IF;
DBMS_OUTPUT.put_line(OUT_DEFSTR8);
END LOOP;
CLOSE C_ABC;
END;

交易摘要有:支付宝 、财付通 、代收业务 、网银在线、银联入账、消费、退货、微信支付、利息税、平安付科、转存、结息、代付、2022年费
支付宝:Ali
财付通:Tence
微信支付:Tence
消费:根据交易对手判断,财付通开头的就是Tence,其他的归为未知
银联入账:如果对方是财付通开头则为Tence,否其他归为未知
退货:根据交易对手判断,财付通开头则为就是Tence,目前没有未知
代付:对方进行区别,都是以支付宝和财付通,对应Ali和Tence
平安付科:交行信用卡(后面可能有变)
转存:对方如果是王兴强,则为交通信用卡
代收业务:交行信用卡
网银在线:未知
利息税:税务局
结息:农行
2022年费:农行

订单号

根据附言加工,最终只有18位和33位两种

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR8 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '202201%';
DEFSTR8 VARCHAR2 ( 128 );
--过渡变量
S1 VARCHAR2 ( 128 );
S2 VARCHAR2 ( 128 );
N1 INTEGER;
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO DEFSTR8;--提取游标
IF
C_ABC % NOTFOUND THEN
EXIT;

END IF;
IF
DEFSTR8 IS NOT NULL THEN--判断要处理的字符是否为NULL
DBMS_OUTPUT.put_line ( DEFSTR8 );
DEFSTR8 := translate( DEFSTR8, '#' || translate( DEFSTR8, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', '#' ), '/' );--剔除汉字以及特殊字符
--DBMS_OUTPUT.put_line ( 'WCL:' || DEFSTR8 );
--交易附言除订单号外,可能还有数字或者字母,所以下面处理这部分问题
--计算长度
N1 := LENGTH( DEFSTR8 );
IF
N1 < 6 THEN
DEFSTR8 := '';--说明不是订单号
ELSIF N1 > 18 THEN
--大于18就有可能有问题,但是前18位肯定没问题,所以先取出来
S1 := SUBSTR( DEFSTR8, 1, 18 );
--将可能有问题的部分拿出来进行处理
S2 := SUBSTR( DEFSTR8, 19, N1 );
S2 := translate(S2, 'qwertyuiopasdfghjklzxcvbnmQAZXSWEDCVFRTGBNHYUJMKIOLP', '#' );--,因为后面部分不会有字母,去掉这些字符的字母
/*因为订单号只有18位或者33位两种,所以可以开始处理*/
N1 := 18+NVL ( LENGTH( S2 ), 0 ); --获取当前字符长度
IF( N1 < 33 ) THEN
DEFSTR8 := S1;--这是18位的订单
ELSE
DEFSTR8 := S1 || SUBSTR( S2, 1, 15 );--这是33位的订单,只截取需要(15=33-18)的部分

END IF;
--ELSE 大于6位小于19位认为正常,不处理

END IF;
DBMS_OUTPUT.put_line (DEFSTR8 );

END IF;

END LOOP;
CLOSE C_ABC;
END;

交易备注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE
CURSOR C_ABC IS
SELECT DEFSTR8 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '20221%';
IN_DEFSTR10 VARCHAR2(128); --存储变量
OUT_DEFSTR10 VARCHAR2(128); --结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR10; --提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;
OUT_DEFSTR10:=TRANSLATE(IN_DEFSTR10,'ZXCVBNMASDFGHJKLQWERTYUIOP1234567890','/');
DBMS_OUTPUT.put_line(OUT_DEFSTR10);
END LOOP;
CLOSE C_ABC;
END;

备注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE
CURSOR C_ABC IS
SELECT DEFSTR8 FROM V_DWD_ABC WHERE DEFSTR1 LIKE '20221%';
IN_DEFSTR11 VARCHAR2(128); --存储变量
OUT_DEFSTR11 VARCHAR2(128); --结果变量
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR11; --提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;
OUT_DEFSTR11:=IN_DEFSTR11;
DBMS_OUTPUT.put_line(OUT_DEFSTR11);
END LOOP;
CLOSE C_ABC;
END;

暂定