第一次使用 kettle 以及 greenplum 数据库,特别是 greenplum 数据库网上资料特别稀缺,遇到问题都不知道去哪儿查找,今天总结下遇到过的问题。
今天主题是:如何使用 kettle 调用 greenplum 编写的存储过程。
一、创建一个简单的学生表,用来给存储过程做简单的数据插入
--创建表
create table student(
sid NUMERIC,
sname varchar(20),
sdate varchar(8)
);
二、创建操作学生表的存储过程
--创建存储过程
create or replace function My_LALIAN_PRO(IN S_ID NUMERIC, IN S_NAME VARCHAR, IN S_DATE VARCHAR)
returns void
as $$
begin
--插入学生表
insert into odmdb.odm.student values(S_ID, S_NAME, S_DATE);
end;
$$
language plpgsql;
三、在数据库中测试存储过程
--执行存储过程
select My_LALIAN_PRO(1,'feiniu','201901');
执行结果如下:
a.png
从图中可以看出,我们编写的存储过程没有问题。
四、使用 Kettle 执行 存储过程
在 sql 脚本窗口中填写调用语句:
select My_LALIAN_PRO(2,'tangtang','201902');
如下图:
b.png
五、执行转换
这一步最坑爹了,眼看到嘴的鸡腿却让他给飞了,执行时候竟然报 "存储过程不存在" 报错,这到底是为何?在网上找了差不多两天,在绝望之际在过程名前面加用户名,但是报一样的错误,此刻差点就从楼上跳到游泳池去了。。。 c.png六、问题的解决
后来发现我们的 greenplum 和 oracle 的过程调用有那么一丢丢不同,oracle 可以使用 "用户名.过程名" 方式进行调用,然而这种方式对于我们的 greenplum 大人不适合呀;经过观察发现,我们的 过程 和 表 都存放在 数据库的模式中,因此我们可以直接从这里入手,方式就是 "数据库.模式.存储过程/表名" ,现将过程中的表前面做如下修改: d.png接下来在 kettle 脚本里边将 sql 语句改为:
select odmdb.odm.My_LALIAN_PRO(2,'tangtang','201902')
我们在执行发现已经成功了:
e.png
此时发现表中多了一条数据:
f.png
到这里总算成功了,虽然看上去简单,但是在问题没有解决之前还是挺绝望的,为以后再次踩同一个坑,也为了后来人避免踩这个坑,做了个总结,如果觉得有帮助给个赞,谢谢!
您的支持是我坚持总结的动力 * ^_^ *
网友评论