KSH脚本生成SQL树形结构异常:缺失非左分支子节点求助
KSH树形结构生成脚本问题排查与修复
问题定位
你的脚本仅能遍历根节点第一层级左侧节点的全量子节点,却遗漏了右侧节点(如示例中的1.2)的子节点,核心问题有以下几点:
- 缺失SQL执行逻辑:脚本定义了查询子节点的
Inp_OraSql,但没有执行这条SQL并将结果赋值给Out_Comentario的代码,导致后续循环的子节点数据不完整。 - 子节点拆分逻辑隐患:
set -- ${Out_Comentario}依赖$__SL作为分隔符,若SQL输出格式与该分隔符不匹配,会导致子节点无法被拆分为循环的独立参数。 - 递归流程不规范:当前脚本的节点记录与递归调用顺序混乱,容易导致部分节点的递归触发失败。
修复步骤
- 补全SQL执行逻辑:调用Oracle客户端(如
sqlplus)执行查询SQL,过滤掉表头、连接信息等冗余输出,将纯子节点数据赋值给Out_Comentario。 - 修正子节点拆分逻辑:使用换行符作为分隔符拆分SQL输出(适配
sqlplus的默认输出格式),确保每个子节点都能成为循环的独立参数。 - 规范递归调用流程:先记录当前节点,再遍历所有子节点触发递归,保证每个节点的子节点都能被遍历。
修复后的示例代码
PRC_SECUENCIA=$1 # Oracle连接参数(请替换为实际凭据) Inp_OraServicio=IGRI Inp_OraUser="你的Oracle用户名" Inp_OraPass="你的Oracle密码" # 执行SQL获取当前节点的所有子节点,过滤冗余输出 Inp_OraSql="SELECT SECUENCIA FROM IGRI.BOL_INC_DE_RED WHERE SEC_BOLETIN_RAIZ='${PRC_SECUENCIA}' ORDER BY SECUENCIA" Out_Comentario=$(sqlplus -s ${Inp_OraUser}/${Inp_OraPass}@${Inp_OraServicio} <<EOF SET HEADING OFF SET FEEDBACK OFF SET PAGESIZE 0 ${Inp_OraSql} EXIT EOF ) # 用换行符拆分子节点为循环参数 IFS=$'\n' set -- ${Out_Comentario} IFS=$' \t\n' # 记录当前节点到日志 print -r -- "${PRC_SECUENCIA}" >> /users/cairo/OmegaCAIRO/bin/GesOPV2/FunEntAstro/pbaFunciones/arbol.log # 遍历所有子节点,触发递归 for __derivado in "${@}" do # 跳过空行,避免无效递归 [[ -z "${__derivado}" ]] && continue FunEnt_OPV_getIgriTicketDerivados_Arbol "${__derivado}" done
额外说明
- 请替换代码中的Oracle用户名和密码为实际信息,或使用环境变量等安全方式传递凭据。
- 若
FunEnt_OPV_getIgriTicketDerivados_Arbol是当前脚本的内部函数,需确保其逻辑与上述代码一致,否则递归流程仍会失效。
内容的提问来源于stack exchange,提问作者Mayte
相关产品推荐
相关产品推荐

