Я работаю над прототипом приложения 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
В любом случае вы, скорее всего, захотите создать файл Docker с несколькими состояниями — один для установки, а другой для компиляции, см. docs.docker.com/build/building/multi-stage
Итак, вы бы включили RUN cobc в многоэтапную сборку?
Да, таким образом настройку не нужно выполнять каждый раз, но часть уже будет сохранена в образе, который вы затем принудительно создадите, только если зависимости изменятся (или вы делаете apt update
также во второй части, если вы хотите каждый раз использовать самую последнюю версию)
Для EXEC anything
вам необходимо сначала предварительно обработать файл, в данном случае с помощью EXEC SQL
препроцессора. Для MySQL я бы предложил использовать GixSQL.
Затем это преобразует EXEC
в «чистый COBOL», который затем будет передан компилятору COBOL.
Я посмотрю на это, спасибо. Вы когда-нибудь работали с GixSQL?
Да, я это сделал (и видел, что в целом он работает хорошо, и у меня есть неустраненная ошибка в огромном контексте приложения [см. его систему отслеживания проблем, если вам интересно). Но я думаю, что эти детали на самом деле не являются частью ответа на ваш вопрос, не так ли? Если нет, пожалуйста, проголосуйте/примите.
Я немного не понимаю, как интегрировать его в свой проект.
... тогда я предлагаю проверить его README и, если у вас возникнут какие-либо проблемы, задать дополнительный вопрос по этому поводу.
Правильно ли я понимаю: мне нужно установить ENV-Vars в моем Dockerfile, чтобы передать «<dbtype>://<host>[:port][/dbname][?[opt1=val1]&...]» в КОБОЛ? Или как COBOL получает эту информацию
Это совершенно другой вопрос, чем ошибка компиляции. Я бы предложил разделить эти вопросы — 1 вопрос + 1 ответ. Что вы думаете о том, чтобы оставить этот (возможно, с отредактированными) вопрос «как скомпилировать EXEC SQL
в COBOL» и еще один вопрос «как настроить соединения GixSQL» и потенциально другие для докерной части? .... и, конечно, всегда полезно иметь для каждого из них «что вы пробовали, что вам скажет хотя бы беглый взгляд на документацию» вместе с соответствующим примером кода.
Извините за поздний ответ, я работал над разными темами. Это здорово, большое вам спасибо.
Кстати, я создал новый вопрос. stackoverflow.com/questions/78502839/…
Можете ли вы помочь и с этим вопросом? Огромное спасибо заранее.
«вызов cobc_plex_strdup с нулевым указателем» — не могли бы вы загрузить пример (полный/минимальный исходный код для его воспроизведения) в систему отслеживания ошибок gnucobol ?