我正在UNIX上编写Microfocus COBOL代码,并试图使用已经创建的系统DSN连接到Postgres数据库,为了连接到该数据库,我在代码中执行以下SQL查询:-
EXEC SQL CONNECT TO ‘SYSTEM_DSN’ USER ‘username.password’ END-EXEC.
然而,当我提交Microfocus COBOL代码的JCL时,我在响应中遇到了以下错误:-
JCLCM0188I J0003556 BE24010R JOB STARTED 01:02:56
CASKC0027E Error executing service 'PGM#AR641010' Load error : file 'sqlastrt' error code: 173, pc=F97, call=1, seg=0 173 Called program file not found in drive/directory 01:02:57
JCLCM0192S J0003556 BE24010R STEP ABENDED STEP001 - COND CODE RTS0173 01:02:57
JCLCM0181S J0003556 BE24010R JOB ABENDED - COND CODE RTS0173 01:02:57
在/etc/ODBC.ini中创建了ODBC驱动程序DSN,其中包含以下详细信息:-
[DTF_Postgres_DSN]
Driver=/usr/edb/connectors/odbc/edb-odbc.so
实际上,错误并没有说"无法连接到postgres",而是说"找不到调用的程序文件'sqlastrt'"。
所示的EXEC SQL
很可能由预编译器转换为CALL 'sqlastrt'
,并且在COBOL运行时环境中找不到此模块/函数。
选项:
-
如果某个地方有一个同名的模块:将其目录包含在COBOL运行路径中(并使用
ldd
检查其依赖项是否在LD_LIBRARY_PATH
中(,否则 - 预加载提供此函数的共享对象(postgresql/odbc库((同时验证
ldd
没有显示任何丢失的依赖项(或 - 确保编译器对生成的
CALL
使用静态链接,并对postgresql/odbc库使用链接,这样就不会在COBOL运行时中进行动态模块搜索,而是在COBOL程序加载到内存中时系统会加载它
一旦这个问题得到解决,您就可以检查postgres/odbc库是否真的找到/读取了您创建的DSN。