0

我正在研究 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
4

1 回答 1

4

实际上,错误并没有说“无法连接到 postgres”,而是“找不到调用的程序文件 'sqlastrt'”。

显示的很可能EXEC SQL是由预编译器翻译的,CALL 'sqlastrt'并且在 COBOL 运行时环境中找不到此模块/功能。

选项:

  • 如果某处有同名的模块:在 COBOL 运行路径中包含其目录(并检查ldd其依赖项是否在 中LD_LIBRARY_PATH), 否则要么
  • 预加载提供此功能的共享对象(postgresql/odbc 库)(同时验证ldd不显示任何缺少的依赖项)
  • 确保您的编译器对生成CALL的 s 使用静态链接并链接到 postgresql/odbc 库,这样在 COBOL 运行时中没有动态模块搜索,而是在 COBOL 程序加载到内存时系统将加载它

解决此问题后,您将能够检查 postgres/odbc 库是否确实找到/读取了您创建的 DSN。

于 2018-08-01T14:37:38.047 回答