本文档适用于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 作业类型了
请登录后评论~