dwd_tence实现

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

交易日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DECLARE 
CURSOR C_ABC IS SELECT DEFSTR1 FROM ODS_TENCE WHERE DEFSTR1<>'交易时间';
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(SUBSTR(IN_DEFSTR1,1,INSTR(IN_DEFSTR1,' ')-1),'yyyy/mm/dd');
DBMS_OUTPUT.put_line(OUT_DEFSTR1);
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
DECLARE
CURSOR C_ABC IS SELECT DEFSTR1 FROM ODS_TENCE WHERE DEFSTR1<>'交易时间' AND DEFSTR1 LIKE'2022/1%';
IN_DEFSTR2 VARCHAR2(128);--存储变量
OUT_DEFSTR2 VARCHAR2(128);--结果变量
--过渡变量
S1 VARCHAR2 ( 128 );
S2 VARCHAR2 ( 128 );
N1 INTEGER;
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR2;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

S1:=SUBSTR(IN_DEFSTR2,INSTR(IN_DEFSTR2,' ')+1,INSTR(IN_DEFSTR2,':',1,2)-INSTR(IN_DEFSTR2,' ',1,1)-1);
N1:=LENGTH(S1);
CASE N1
WHEN 4 THEN OUT_DEFSTR2:='0'||S1;
ELSE OUT_DEFSTR2:=S1;
END CASE;
DBMS_OUTPUT.put_line(OUT_DEFSTR2);
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
DECLARE
CURSOR C_ABC IS SELECT DEFSTR6 FROM ODS_TENCE WHERE DEFSTR1<>'交易时间';
IN_DEFSTR4 VARCHAR2(128);--存储变量
OUT_DEFSTR4 VARCHAR2(128);--结果变量
--过渡变量
S1 VARCHAR2 ( 128 );
S2 VARCHAR2 ( 128 );
N1 INTEGER;
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC INTO IN_DEFSTR4;--提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

OUT_DEFSTR4:=REPLACE(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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
DECLARE
CURSOR C_ABC IS
SELECT DEFSTR5, DEFSTR2 FROM ODS_TENCE WHERE DEFSTR1 <> '交易时间';
IN_DEFSTR5 VARCHAR2(128); --存储变量
OUT_DEFSTR5 VARCHAR2(128); --结果变量
--过渡变量
S1 VARCHAR2(128);
N1 INTEGER;
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC
INTO IN_DEFSTR5, S1; --提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

IF IN_DEFSTR5 = '/' THEN
IF S1 = '零钱提现' THEN
OUT_DEFSTR5 := '支出';
ELSIF S1 = '零钱充值' THEN
OUT_DEFSTR5 := '收入';
ELSE
OUT_DEFSTR5 := '待处理的收支信息';
END IF;
ELSIF IN_DEFSTR5 = '收入' THEN
OUT_DEFSTR5 := '收入';
ELSIF IN_DEFSTR5 = '支出' 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
18
19
20
21
22
23
24
DECLARE
CURSOR C_ABC IS
SELECT DEFSTR5 FROM ODS_TENCE WHERE DEFSTR1 <> '交易时间';
IN_DEFSTR6 VARCHAR2(128); --存储变量
OUT_DEFSTR6 VARCHAR2(128); --结果变量
--过渡变量
S1 VARCHAR2(128);
N1 INTEGER;
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;

交易本方

交易本方比较多数可以了直接通过支付方式一一对应,稍微麻烦的是支付方式中的/和农行。他们需要根据当前状态判断。目前支付方式为/的都是微信;关于涉及微信与农行流转的信息,由于在收支方向规定了从微信提现为支付,所以本方是微信,反则为农行,其他的对应关系如下:
农业银行(0076):ABC
交通银行(0757):BOC
零钱:TENCE
工商银行(4868):ICBC

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
DECLARE
CURSOR C_ABC IS
SELECT DEFSTR7,DEFSTR8 FROM ODS_TENCE WHERE DEFSTR1 <> '交易时间';
IN_DEFSTR7 VARCHAR2(128); --存储变量
OUT_DEFSTR7 VARCHAR2(128); --结果变量
--过渡变量
S1 VARCHAR2(128);
N1 INTEGER;
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC
INTO IN_DEFSTR7,S1; --提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

IF IN_DEFSTR7='/'THEN
-- 先处理一般特殊情况
IF S1='已存入零钱' THEN
--这种情况表示存入微信
OUT_DEFSTR7:='TENCE';
ELSE
--其他情况待处理
OUT_DEFSTR7:='待处理';
END IF;
ELSIF IN_DEFSTR7='农业银行(0076)' THEN
--现在处理农行的特殊情况
IF S1='提现已到账' THEN
-- 微信提现到农行,因为收支字段判断为支出,所以本方是微信
OUT_DEFSTR7:='TENCE';
ELSIF S1 IN('充值完成','已转账','已全额退款','对方已退还','支付成功','对方已收钱') THEN
--这些情况属于通过微信使用农行卡,包括微信的零钱充值,本方属于农行
OUT_DEFSTR7:='ABC';
ELSE OUT_DEFSTR7:='新的农行使用方式';
END IF;
ELSIF IN_DEFSTR7 IN('交通银行(0757)','零钱','工商银行(4868)') THEN
CASE IN_DEFSTR7
WHEN '交通银行(0757)' THEN OUT_DEFSTR7:='BOC';
WHEN '零钱' THEN OUT_DEFSTR7:='TENCE';
WHEN '工商银行(4868)' THEN OUT_DEFSTR7:='ICBC';
END CASE;
ELSE
--其他支付方式
OUT_DEFSTR7:='未知的本方信息';
END IF;
DBMS_OUTPUT.put_line(OUT_DEFSTR7 || S1);
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
DECLARE
CURSOR C_ABC IS
SELECT DEFSTR3,DEFSTR2 FROM ODS_TENCE WHERE DEFSTR1 <> '交易时间';
IN_DEFSTR8 VARCHAR2(128); --存储变量
OUT_DEFSTR8 VARCHAR2(128); --结果变量
--过渡变量
S1 VARCHAR2(128);
N1 INTEGER;
BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC
INTO IN_DEFSTR8,S1; --提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;

IF IN_DEFSTR8='农业银行(0076)' AND S1='零钱充值' THEN
OUT_DEFSTR8:='TENCE';
ELSE
OUT_DEFSTR8:=IN_DEFSTR8;
END IF;
DBMS_OUTPUT.put_line(OUT_DEFSTR8);
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
DECLARE
CURSOR C_ABC IS
SELECT DEFSTR9 FROM ODS_TENCE WHERE DEFSTR1 <> '交易时间';
IN_DEFSTR9 VARCHAR2(128); --存储变量
OUT_DEFSTR9 VARCHAR2(128); --结果变量

BEGIN
OPEN C_ABC;
LOOP
FETCH C_ABC
INTO IN_DEFSTR9; --提取游标
IF C_ABC % NOTFOUND THEN
EXIT;
END IF;
OUT_DEFSTR9:=IN_DEFSTR9;
DBMS_OUTPUT.put_line(OUT_DEFSTR9);
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
DECLARE
CURSOR C_ABC IS
SELECT DEFSTR4 FROM ODS_TENCE WHERE DEFSTR1 <> '交易时间';
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:=IN_DEFSTR10;
DBMS_OUTPUT.put_line(OUT_DEFSTR10);
END LOOP;
CLOSE C_ABC;
END;

备注

1

暂定