容器化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
相关产品推荐
相关产品推荐

