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

容器化COBOL应用中GixSQL安装配置及ODBC连接求助

容器化COBOL应用ODBC连接构建错误与GixSQL集成问题

问题场景

开发容器化COBOL应用原型,尝试通过ODBC连接数据库时,Docker构建阶段出现以下错误:

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)

经推荐需使用GixSQL预处理文件,但存在以下困惑:

  • GixSQL安装流程不清晰
  • 不清楚如何与ODBC连接
  • DATASRC连接字符串的配置位置
  • 无法在Dockerfile中集成GixSQL执行

现有代码文件

Dockerfile

# Define app directory
ARG FUNCTION_DIR="/function"

FROM --platform=linux/amd64 python:3.10-buster as build-image

# Vermeiden von Interaktionen bei der Installation von Paketen
ENV DEBIAN_FRONTEND=noninteractive

# Install aws-lambda build dependencies
RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  wget \
  gnucobol \
  gnucobol-cobsql \
  unixodbc \
  unixodbc-dev \
  wget \
  gnucobol \
  gnucobol-cobsql \
  unixodbc \
  unixodbc-dev \
  wget \
  gnupg \
  default-libmysqlclient-dev \
  make \
  && rm -rf /var/lib/apt/lists/* \
  && 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

# Include global arg in this stage of the build
ARG FUNCTION_DIR

# Create function directory
CMD mkdir -p ${FUNCTION_DIR}

# Copy code directory
COPY app/* ${FUNCTION_DIR}/

# Install the runtime interface client
RUN pip install \
  --target ${FUNCTION_DIR} \
  awslambdaric

# Install the AWS Software Development Kit for Python
RUN pip install \
  --target ${FUNCTION_DIR} \
  boto3

# Install requests for Python
RUN pip install \
  --target ${FUNCTION_DIR} \
  requests

# Set environment variables for MySQL Database configuration
ENV MYSQL_DATABASE=bank1 \
  MYSQL_USER=admin \
  MYSQL_PASSWORD=12345    \
  MYSQL_HOST=databasestring \
  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
#RUN cobc -x -free -std=default -I/usr/include/mysql/ ${FUNCTION_DIR}/YTR93.cob -o YTR93 -L/usr/lib -lmysqlclient
RUN cobc -x -std=default -free -I/usr/include/mysql /function/YTR93.cob -o YTR93 -L/usr/lib -lmysqlclient

# Multi-stage build: grab a fresh copy of the base image
FROM python:3.10-buster

# Ensure that the runtime requirements for cobol are met
RUN apt update && apt install libcob4

# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}

# Copy in the build image dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}

ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
CMD [ "app.handler" ]

COBOL代码片段

PROCEDURE DIVISION.
MAIN-PROCEDURE.

   EXEC SQL
      CONNECT TO :DB-NAME AT :DB-SERVER AS :DB-USER IDENTIFIED BY :DB-PASSWORD
   END-EXEC.

   EVALUATE SQLCODE
      WHEN 0
            DISPLAY "Connected successfully to remote MySQL server."
      WHEN OTHER
            DISPLAY "Connection error: ", SQLERRMC
   END-EVALUATE.

解决方案:GixSQL安装配置与Docker集成

1. 在Docker构建阶段安装GixSQL

在build-image阶段添加GixSQL的编译安装步骤:

# 安装GixSQL依赖与工具
RUN apt-get update && apt-get install -y git gcc libc6-dev libodbc1 && \
    git clone https://github.com/ebassi/gixsql.git && \
    cd gixsql && make && make install && \
    cd .. && rm -rf gixsql && \
    rm -rf /var/lib/apt/lists/*

GixSQL依赖Git、GCC和ODBC基础库,编译后会安装到系统全局路径,方便后续调用。

2. 调整COBOL代码适配GixSQL规范

GixSQL要求必须声明SQLCA结构,同时SQL语句语法需匹配其预处理规则,修改后的代码如下:

IDENTIFICATION DIVISION.
PROGRAM-ID. YTR93.
DATA DIVISION.
WORKING-STORAGE SECTION.
* 声明GixSQL必需的SQLCA结构
EXEC SQL INCLUDE SQLCA END-EXEC.
* 定义数据库连接变量
01 DB-NAME PIC X(10) VALUE "bank1".
01 DB-SERVER PIC X(50) VALUE "databasestring".
01 DB-USER PIC X(10) VALUE "admin".
01 DB-PASSWORD PIC X(10) VALUE "12345".

PROCEDURE DIVISION.
MAIN-PROCEDURE.
   EXEC SQL
      CONNECT TO :DB-NAME AT :DB-SERVER USER :DB-USER USING :DB-PASSWORD
   END-EXEC.

   EVALUATE SQLCODE
      WHEN 0
            DISPLAY "Connected successfully to remote MySQL server."
      WHEN OTHER
            DISPLAY "Connection error: ", SQLERRMC
   END-EVALUATE.
   STOP RUN.

要点:添加SQLCA声明,将AS ... IDENTIFIED BY替换为GixSQL支持的USER ... USING语法。

3. 在Dockerfile中集成GixSQL预处理流程

替换原有的COBOL编译步骤,先通过GixSQL预处理SQL语句,再用cobc编译标准COBOL代码:

# 预处理COBOL文件(生成包含标准COBOL语法的文件)
RUN cd ${FUNCTION_DIR} && gixsql YTR93.cob YTR92.cob
# 编译预处理后的文件,链接ODBC库
RUN cobc -x -free -std=default -I/usr/include -L/usr/lib -lodbc ${FUNCTION_DIR}/YTR93.cob ${FUNCTION_DIR}/YTR92.cob -o ${FUNCTION_DIR}/cobol-program

GixSQL会自动识别EXEC SQL块并转换为COBOL可编译的代码,编译时必须链接ODBC库(-lodbc)以支持数据库连接。

4. ODBC数据源与DATASRC配置

配置ODBC数据源

在build-image阶段添加odbc.ini配置,定义可直接调用的数据源:

# 创建odbc.ini定义MySQL数据源
RUN echo "[MYSQL_DS]\n\
Driver=MySQL\n\
Server=$MYSQL_HOST\n\
Port=$MYSQL_PORT\n\
Database=$MYSQL_DATABASE\n\
User=$MYSQL_USER\n\
Password=$MYSQL_PASSWORD" > /etc/odbc.ini

DATASRC设置

  • 方式1:在COBOL代码中直接使用数据源名称,修改CONNECT语句为EXEC SQL CONNECT TO MYSQL_DS USER :DB-USER USING :DB-PASSWORD END-EXEC
  • 方式2:设置环境变量ENV DATASRC=MYSQL_DS,GixSQL会自动读取该变量作为默认数据源

5. 验证步骤

构建镜像时,确保GixSQL预处理无报错,编译过程正常。运行容器后,可通过isql MYSQL_DS命令测试ODBC连接是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:04:55