本文档适用于TASKCTL6.X/7.X。
我们都知道TASKCTL支持任意作业类型的扩展,但目前 TASKCTL 6.x/7.x 版本中并没有内置 GaussDB 存储过程 的作业插件。通过如下文档介绍使 TASKCTL 支持调度 GaussDB 存储过程作业类型的步骤,一方面解决一些朋友迫切的 GaussDB 存储过程调度需求,另一方面抛砖引玉,让大家能够在TASKCTL中扩展更多的适应自己需求的作业插件。
其实在论坛中已经有非常多其他插件的介绍,这里帖几个参考引用贴供大家参考:
http://www.taskctl.com/forum/detail_355.html
http://www.taskctl.com/forum/detail_351.html
1、在 $TASKCTLDIR/src/plugin/gaussdb/shell/ 目录中新增 cprungaussdbjob.sh 作业插件,实际上就是一个shell程序,代码如下:
#!/bin/bash
#------------------------------------------------------------------------------
# 20210520 塔斯克 cdchen 适配
# (一) 功能: GaussDB存储过程 shell 方式执行驱动插件程序
# (二) 参数:
# 1. tccid: 【无用】容器(流程或定时器)ID
# 2. jobid: 【无用】作业ID
# 3. progname 【有用】对应相应任务的progname属性,一般为存储过程名称
# 4. para 【有用】对应相应任务的para属性,一般为存储过程的入口参数,格式
# 为 'para1','para2', ...
# 5. exppara 【有用】对应相应任务的exppara属性,一般为数据库连接信息,格式
# 为 dbname,dbuser,dbpasswd
# 6. hostuser 【无用】远程主机用户链接信息。远程主机用户链接信息对应作业的hostuser属性
# 最后拼接执行语句如下
# sh $TASKCTLDIR/src/plugin/gaussdb/shell/cprungaussdbjob.sh 'Sp_Ldm_Cde_Rate' 2014-10-17 'ORCL,DATACORE,DATACORE'
# sh $TASKCTLDIR/src/plugin/gaussdb/shell/cprungaussdbjob.sh 'sp_zjgrcb_data_cleaning' '2014-10-17' 'ORCL,DATACORE,DATACORE'
# (三) 存储过程接口要求:
# [过程名称]
# (
# in char var1,
# in char var2,
# ...
# out int retvalue,
# out char retmsg
# )
#
# 说明:
# 1. 该插件要求存储过程必须有两个输出参数
# 2. retvalue返回值 返回0表示成功,非0失败
# 3. 如果输出参数不满足要求,您可以修改该插件,以适应您的存储过程接口
#
#
# (四) 流程模式代码任务定义举例:
# 1. 无输入参数存储过程
# <[存储过程自定义任务类型名]gaussdb>
# <name>job1</name>
# <progname>[存储过程名]</progname>
# <exppara>$(dbname),$(dbuser),$(dbpasswd)</exppara>
# </[存储过程自定义任务类型名]gaussdb>
#
# 2. 1个输入参数存储过程, 比如是workdate流程变量
# <gaussdb>
# <name>job2</name>
# <progname>myproc1</progname>
# <para>'$(workdate)'</para>
# <exppara>$(dbname),$(dbuser),$(dbpasswd)</exppara>
# <gaussdb>
#
# 3. 2个输入参数存储过程(如果多个,以此类推)
# <gaussdb>
# <name>job1</name>
# <progname>myproc2</progname>
# <para>'para1','para2'</para>
# <exppara>$(dbname),$(dbuser),$(dbpasswd)</exppara>
# <gaussdb>
#------------------------------------------------------------------------------
if [ $# -ne 6 ]
then
echo "Param error !"
echo "Usage: $0 tccid jobid progname para expara hostuser"
exit 126
fi
#------------------------------------------------------------------------------
# 第一步: 接收参数
#------------------------------------------------------------------------------
# tccid=$1
# jobid=$2
ProgName=$3
#此处为了去前后空格,以便判断是否真正有入口参数
Para=$(echo $4)
ExpPara=$5
# HostUser=$6
#------------------------------------------------------------------------------
# 第二步: 解析exppara,分别获取数据库名称、用户、密码等信息
#------------------------------------------------------------------------------
# 数据库名 并去前后空格
tmpstr=`echo ${ExpPara}|awk -F ',' '{print $1}'`
DBNAME=`echo ${tmpstr}`
# 数据库用户 并去前后空格
tmpstr=`echo ${ExpPara}|awk -F ',' '{print $2}'`
DBUSER=`echo ${tmpstr}`
# 数据库密码 并去前后空格
tmpstr=`echo ${ExpPara}|awk -F ',' '{print $3}'`
DBPASSWD=`echo ${tmpstr}`
#------------------------------------------------------------------------------
# 第三步: 执行存储过程,执行时应判断参数是否为空
#------------------------------------------------------------------------------
# 需要添加gsql的客户端配置文件
# source /opt/huawei/Bigdata/mppdb/.mppdbgs_profile
# source ~/.bashrc
# 执行存储过程
# 最终会拼接为 gsql -h IP地址 -d 数据库名 -U 用户名 -W 密码 -p 端口
# 然后加begin 存储过程名(参数等) 打印输出结果 end;
if [ -z ${Para} ];then
echo "${ProgName}(cret)"
sqlstr=`gsql -h 10.40.0.41 -d ${DBNAME} -U ${DBUSER} -W ${DBPASSWD} -p 25108 -r << EOF 2>&1
declare
ret number;
cret varchar2(128);
begin
${ProgName}(cret);
dbms_output.put_line('result'||cret);
end;
/
\\q
EOF`
else
#执行存储过程
echo "${ProgName}('${Para}',ret,cret)"
sqlstr=`gsql -h 10.40.0.41 -d ${DBNAME} -U ${DBUSER} -W ${DBPASSWD} -p 25108 -r << EOF 2>&1
declare
ret number;
cret varchar2;
begin
${ProgName}('${Para}',ret,cret);
dbms_output.put_line('result'||ret);
end;
/
\\q
EOF`
fi
#------------------------------------------------------------------------------
# 第四步: 插件返回
#------------------------------------------------------------------------------
#echo "================================================================================"
echo -e "${sqlstr}"
# 因为 gsql 没有类似sqlplus WHENEVER SQLERROR、WHENEVER OSERROR 所以必须用存储过程输入参数作为状态。
out=$(echo "${sqlstr}" |awk -F 'result' '{print $2}'|awk -F ' ' '{print $1}')
echo ${out}
if [ ${out} -eq "0" ];
then
echo 0
exit 0
else
echo 1
exit 1
fi
2、在桌面软件admin中进入"任务类型"功能中,新增作业类型
作业类型名称 :gaussdb (决定在Designer、Monitor等使用是类型,不一定叫 gaussdb )
执行方式 因为我们是shell 然后执行程序 为上述新增的脚本
$TASKCTLDIR/src/plugin/gaussdb/shell/cprungaussdbjob.sh,如下图所示:
新版本有高级定义和 执行插件头部的有用无用对应即可
3、在桌面软件 Designer 中节点工具箱即可看到新增 gaussdb 作业类型;
同时参照执行插件中的配置方式,设计 gaussdb 作业如下代码片段:(以实际情况为准)
<gaussdb> <name>MainModul_gaussdb_1</name> <progname>Sp_Ldm_Cde_Rate</progname> <para>2014-10-17</para> <exppara>ORCL,DATACORE,DATACORE</exppara> </gaussdb>
保存 并 编译流程,如果成功,则可以选中作业 右键 ,进行单作业验证调试,如果没有通过根据提示调整执行插件,直到成功为止 。就可以正式使用 gaussdb 作业类型了
请登录后评论~



