You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GnuCOBOL通过Dockerfile连接MySQL数据库遇报错求助

容器化COBOL应用ODBC连接MySQL编译报错排查

报错信息

0.141 /function/YTR93.cob: 36: error: SQLCA: No such file or directory
0.141 /function/YTR93.cob: 36: error: syntax error, unexpected Identifier or Literal, expecting .
0.151 /function/YTR93.cob: 34: error: invalid level number 'EXEC'
0.152 cobc: call to cobc_plex_strdup with NULL pointer
0.152 cobc: aborting codegen for /function/YTR92.cob (unknown: unknown)

涉及代码

COBOL SQL代码片段

EXEC SQL
      INCLUDE SQLCA
    END-EXEC.
    EXEC SQL
     CONNECT TO 'MySQL' USER 'admin' IDENTIFIED BY 'ABCDEF'
    END-EXEC.
    EXEC SQL
       SELECT Vorname INTO :host_variable
       FROM table_name
       WHERE condition
     END-EXEC.

Dockerfile内容

RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  wget \
  gnucobol \
  unixodbc \
  unixodbc-dev \
  wget \
  gnupg \
  && wget https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc_8.0.29-1ubuntu20.04_amd64.deb \
  && dpkg -i mysql-connector-odbc_8.0.29-1ubuntu20.04_amd64.deb || apt-get -f install -y \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /mysql-connector-odbc_*.deb


# Set environment variables for MySQL Database configuration
ENV MYSQL_DATABASE=bank1 \
    MYSQL_USER=admin \
    MYSQL_PASSWORD=B:7L1f!r?xP3?8    \
    MYSQL_HOST=database-1.cho40iaoa3pu.eu-central-1.rds.amazonaws.com \
    MYSQL_PORT=3306

# Setup ODBC Driver in odbcinst.ini
RUN echo "[MySQL]\n\
Description=ODBC for MySQL\n\
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8a.so\n\
Setup=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8S.so\n\
FileUsage=1\n\
Server=$MYSQL_HOST\n\
User=$MYSQL_USER\n\
Password=$MYSQL_PASSWORD\n\
Database=$MYSQL_DATABASE\n\
Port=$MYSQL_PORT" > /etc/odbcinst.ini

# Interaktive Frontend Einstellungen zurücksetzen
ENV DEBIAN_FRONTEND=dialog

# Compile the cobol programs
RUN cobc -x --free ${FUNCTION_DIR}/YTR93.cob ${FUNCTION_DIR}/YTR92.cob -o ${FUNCTION_DIR}/cobol-program -lsqlca

问题分析与解决步骤

1. 核心问题:GnuCOBOL不原生支持EXEC SQL语法

报错中的invalid level number 'EXEC'和SQLCA找不到,本质是GnuCOBOL没有内置SQL预处理器,无法识别嵌入式SQL语法,需要使用配套的预处理器处理后再编译。

2. 安装SQL预处理器

在Dockerfile的apt-get安装步骤中添加cobc-sql包:

RUN apt-get update && \
  apt-get install -y \
  # ... 原有依赖包 ...
  gnucobol \
  cobc-sql \  # 新增SQL预处理器
  unixodbc \
  # ... 其余安装步骤 ...

3. 修改编译流程:先预处理再编译

替换原Dockerfile中的编译步骤,先通过cob_sql处理嵌入式SQL,再用cobc编译生成的文件:

# 替换原编译命令
RUN cd ${FUNCTION_DIR} && \
  # 预处理每个COBOL文件,生成带.cob.sql后缀的中间文件
  cob_sql YTR93.cob && \
  cob_sql YTR92.cob && \
  # 编译预处理后的文件,链接ODBC库
  cobc -x --free YTR93.cob.sql YTR92.cob.sql -o cobol-program -lodbc
  • 注意:移除-lsqlca参数,预处理后会自动处理SQLCA的包含逻辑;改用-lodbc链接系统ODBC库。

4. 修正SQLCA引用(可选)

如果预处理后仍存在SQLCA相关报错,可以将代码中的EXEC SQL INCLUDE SQLCA替换为COBOL原生的COPY语句:

COPY SQLCA.

sqlca.cob文件通常随cobc-sql安装在/usr/share/gnucobol/copy/目录下,GnuCOBOL会自动识别该路径。

5. 修正ODBC配置文件

原odbcinst.ini中混入了连接参数,该文件仅用于注册驱动,连接参数需放在odbc.ini中。修改Dockerfile的配置步骤:

# 注册MySQL ODBC驱动到odbcinst.ini
RUN echo "[MySQL]\n\
Description=ODBC for MySQL\n\
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8a.so\n\
Setup=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc8S.so\n\
FileUsage=1" > /etc/odbcinst.ini

# 创建odbc.ini存放数据库连接参数
RUN echo "[MySQLDB]\n\
Driver=MySQL\n\
Server=$MYSQL_HOST\n\
User=$MYSQL_USER\n\
Password=$MYSQL_PASSWORD\n\
Database=$MYSQL_DATABASE\n\
Port=$MYSQL_PORT" > /etc/odbc.ini

同时修改COBOL代码中的连接语句,引用配置好的DSN:

EXEC SQL
 CONNECT TO 'MySQLDB'
END-EXEC.

6. 验证驱动路径

在容器构建过程中添加验证步骤,确保MySQL ODBC驱动路径正确:

RUN ls /usr/lib/x86_64-linux-gnu/odbc/libmyodbc8a.so || echo "驱动文件不存在"

若驱动路径错误,需根据实际安装路径调整odbcinst.ini中的Driver字段。


内容的提问来源于stack exchange,提问作者developchris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:38:20