Как подключиться к базе данных MYSQL в Cobol с помощью Gnucobol (через Dockerfile)

Я работаю над прототипом приложения COBOL в контейнере. Теперь я захотел подключить его к базе данных и нашел ODBC. Но это не сработало, потому что во время сборки докера я получил следующую ошибку:

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)

Это мой 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

«вызов cobc_plex_strdup с нулевым указателем» — не могли бы вы загрузить пример (полный/минимальный исходный код для его воспроизведения) в систему отслеживания ошибок gnucobol ?

Simon Sobisch 16.04.2024 22:41

В любом случае вы, скорее всего, захотите создать файл Docker с несколькими состояниями — один для установки, а другой для компиляции, см. docs.docker.com/build/building/multi-stage

Simon Sobisch 16.04.2024 22:52

Итак, вы бы включили RUN cobc в многоэтапную сборку?

developchris 17.04.2024 17:24

Да, таким образом настройку не нужно выполнять каждый раз, но часть уже будет сохранена в образе, который вы затем принудительно создадите, только если зависимости изменятся (или вы делаете apt update также во второй части, если вы хотите каждый раз использовать самую последнюю версию)

Simon Sobisch 18.04.2024 10:05
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
4
214
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для EXEC anything вам необходимо сначала предварительно обработать файл, в данном случае с помощью EXEC SQL препроцессора. Для MySQL я бы предложил использовать GixSQL.

Затем это преобразует EXEC в «чистый COBOL», который затем будет передан компилятору COBOL.

Я посмотрю на это, спасибо. Вы когда-нибудь работали с GixSQL?

developchris 17.04.2024 19:14

Да, я это сделал (и видел, что в целом он работает хорошо, и у меня есть неустраненная ошибка в огромном контексте приложения [см. его систему отслеживания проблем, если вам интересно). Но я думаю, что эти детали на самом деле не являются частью ответа на ваш вопрос, не так ли? Если нет, пожалуйста, проголосуйте/примите.

Simon Sobisch 18.04.2024 10:07

Я немного не понимаю, как интегрировать его в свой проект.

developchris 18.04.2024 10:48

... тогда я предлагаю проверить его README и, если у вас возникнут какие-либо проблемы, задать дополнительный вопрос по этому поводу.

Simon Sobisch 19.04.2024 11:14

Правильно ли я понимаю: мне нужно установить ENV-Vars в моем Dockerfile, чтобы передать «<dbtype>://<host>[:port][/dbname][?[opt1=val1]&...]» в КОБОЛ? Или как COBOL получает эту информацию

developchris 20.04.2024 15:30

Это совершенно другой вопрос, чем ошибка компиляции. Я бы предложил разделить эти вопросы — 1 вопрос + 1 ответ. Что вы думаете о том, чтобы оставить этот (возможно, с отредактированными) вопрос «как скомпилировать EXEC SQL в COBOL» и еще один вопрос «как настроить соединения GixSQL» и потенциально другие для докерной части? .... и, конечно, всегда полезно иметь для каждого из них «что вы пробовали, что вам скажет хотя бы беглый взгляд на документацию» вместе с соответствующим примером кода.

Simon Sobisch 24.04.2024 10:16

Извините за поздний ответ, я работал над разными темами. Это здорово, большое вам спасибо.

developchris 19.05.2024 15:50

Кстати, я создал новый вопрос. stackoverflow.com/questions/78502839/…

developchris 23.05.2024 21:07

Можете ли вы помочь и с этим вопросом? Огромное спасибо заранее.

developchris 28.05.2024 22:59

Другие вопросы по теме