替换DB2 SQL文件变量后触发DSNC105I读取命令至文件末尾错误
报错原因及解决方案
核心原因
DSNC105I报错的本质是DB2命令行处理器(CLP)读取SQL文件到末尾时,没有找到匹配的语句终止符,无法判定命令结束。你遇到的问题90%以上是换行符格式不兼容或者文件末尾缺少换行导致的:
- 你在Python中用文本模式(参数带
t)读写文件时,程序会根据运行脚本的操作系统自动转换换行符:如果在Windows环境运行脚本,输出的decryptout.sql会使用Windows格式换行(\r\n),而Unix/Linux环境下的DB2 CLP无法识别\r字符,会把单独一行的终止符@识别成@\r,和你指定的-td@终止符不匹配,最终读到文件末尾都找不到有效终止符触发报错。 - 你用
cmp没发现差异,大概率是对比逻辑没有识别隐藏字符,可以执行cat -A decryptout.sql查看,如果行尾出现^M$标记,就说明确实是Windows换行符的问题。 - 另一种可能是原
decrypt.sql最后一行的@后面没有换行,Python处理后输出的文件末尾也没有换行,DB2 CLP要求终止符后必须跟换行符才能判定命令结束,这种情况也会触发EOF报错。
解决方案
你可以任选一种方法修复:
- 修改Python脚本,改用二进制模式读写文件,避免操作系统自动转换换行符:
#!/usr/bin/python3 fin = open("decrypt.sql", "rb") fout = open("decryptout.sql", "wb") for line in fin: fout.write(line.replace(b'table', b'ZXP214')) fin.close() fout.close()
- 保持现有脚本不变,生成文件后执行
dos2unix decryptout.sql转换换行符格式,同时可以手动在文件末尾加一个空行。 - 写文件时强制指定Unix格式换行符:
fout = open("decryptout.sql", "wt", newline='\n')
内容的提问来源于stack exchange,提问作者Fnechz
相关产品推荐
相关产品推荐

