存储过程及Kettle初体验,感觉网上都不清楚,做了demo,简单记录下。

存储过程参考(视频,评论区有相关文档)kettle参考(视频,评论区有相关文档)

1.存储过程

本次存储过程demo主要是从左表到右边的实现过程。

java执行kettle 作业 怎么在kettle执行存储过程_etl


直接贴上代码,其实很简单,就是要理解写法,存储过程中大部分都得给个label,相当于前端给id的意思,方便调用。

过程中大致就是创建存储过程名称,定义变量名,定义结束标志,然后这里用了游标。

处理过程也可以在select时候处理的,一样的。

drop PROCEDURE IF EXISTS p;
CREATE PROCEDURE p()
BEGIN

-- 需要定义接收游标数据的变量
DECLARE id VARCHAR(255);
DECLARE `name` VARCHAR(255);
DECLARE created_date VARCHAR(50);
DECLARE score VARCHAR(50);

-- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;

DECLARE cur CURSOR FOR SELECT
t1.id,
t1.`name`,
t1.created_date,
t1.score
from student_info t1;

-- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

-- 打开游标
OPEN cur;

-- 开始循环
read_loop: LOOP

	-- 提取游标里的数据
	FETCH cur INTO id,`name`,created_date,score;

	-- 声明结束的时候
	IF done THEN

	LEAVE read_loop;

	END IF;

	-- 这里做你想做的循环的事件
	CASE
		WHEN score <= 100 and score >= 85 THEN set score="优秀";
		WHEN  score < 80 and score >= 60 THEN set score="良好";
		WHEN  score < 60 THEN set score="不及格";
		ELSE set score="未知" ;
	END CASE;
		
	SET created_date=date_format(created_date,'%Y年%m月%d日');
		
	INSERT INTO student_result VALUES (id,`name`,created_date,score);

END LOOP;

-- 关闭游标
CLOSE cur;

END

通过call p来调用该存储过程,执行一次,后续只需调用就好了。

call p;
2.Kettle

实现过程功能跟上面相同,只不过是通过kettle实现,直接用kettle不知道怎么处理,因此还是调用了一个存储过程来处理。

java执行kettle 作业 怎么在kettle执行存储过程_etl_02


大致过程:写了一个接口来获取数据库的参数,通过kettle调用api获取参数,然后通过调用存储过程进行处理,再插入新表。

接口代码就不放了

(1)生成记录

主要是写了获取接口的url以及type类型,自己写的接口不需要token什么的,有需要自己写哈。

java执行kettle 作业 怎么在kettle执行存储过程_存储过程_03

2.HTTP client

HTTP client是get,HTTP post是post,REST client是两者都可以。

这里的url是之前写的,如果只是想我这样,只有URL请求,可以不写生成记录,直接这边URL填写路径,data是你返回值的结果。

java执行kettle 作业 怎么在kettle执行存储过程_存储过程_04

3.JSON input

这里我有两个json,主要是因为我还传了一个total,他这个一次只能获取同一级的数值,具体看我的json,data和total是同一层。

{
    "data": {
        "data": [
            {
                "id": "1001",
                "name": "李四",
                "createdDate": "2022-03-10 14:28:52",
                "score": 90
            },
            {
                "id": "1002",
                "name": "王五",
                "createdDate": "2022-06-10 16:28:52",
                "score": 70
            },
            {
                "id": "1003",
                "name": "张三",
                "createdDate": "2022-08-10 09:28:52",
                "score": 59
            }
        ],
        "total": 3
    },
    "code": "ok"
}

$表示当前,.是获取当前,…是递归获取,具体参考文档哈。

java执行kettle 作业 怎么在kettle执行存储过程_java执行kettle 作业_05


java执行kettle 作业 怎么在kettle执行存储过程_java执行kettle 作业_06

4.存储过程

多个参数的话,就需要自己写参数,只有一个可以 直接返回值那里。

java执行kettle 作业 怎么在kettle执行存储过程_big data_07


这里另外写了一个存储过程,包含输入和输出。特别注意的是kettle调用存储过程貌似不能用游标,所以加了total这个参数。

drop PROCEDURE IF EXISTS p1;
CREATE PROCEDURE p1(IN created_date datetime, IN score INT(6), IN total INT(2), OUT date VARCHAR(50), OUT `level` VARCHAR(50))
BEGIN
-- 开始循环
read_loop: LOOP
	
	-- 声明结束的时候
	IF total<=0 THEN

	LEAVE read_loop;

	END IF;

	-- 这里做你想做的循环的事件
	SET total = total-1;
	
	CASE
		WHEN score <= 100 and score >= 85 THEN set `level`="优秀";
		WHEN  score < 80 and score >= 60 THEN set `level`="良好";
		WHEN  score < 60 THEN set `level`="不及格";
		ELSE set `level`="未知" ;
	END CASE;
		
	SET date=date_format(created_date,'%Y年%m月%d日');

END LOOP;

END
5.表输出

java执行kettle 作业 怎么在kettle执行存储过程_big data_08


表连接设置如下

java执行kettle 作业 怎么在kettle执行存储过程_数据仓库_09