Back-Tick внутри сценария оболочки для выполнения запросов MySQL - PullRequest
0 голосов
/ 04 октября 2019

Эта запись кажется похожей, но пользователь указывает, что "long" - это зарезервированный ключ. Поэтому я думаю, что даже этот зарезервированный ключ вызывает некоторую проблему и задает его как новый вопрос.

Мне нужно использовать back-tick внутри сценария оболочки для выполнения запроса MySQL. Имя базы данных содержит дефис. Чтобы рассматривать все имя БД как единое, я заключил его в обратный тик. Но сценарий оболочки использует обратную галочку для подстановки команд. Таким образом, я избежал обратного галочки с "\". Ниже приведен результат.

CREATE TABLE reporting.details AS SELECT * FROM \`Temp-17-09-19\`.details;

Но я получаю следующую ошибку.

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'Temp-17-09-19.details 'не существует

Он рассматривал все "db-name.table_name" (Temp-17-09-19.details) как саму "таблицу". Я не понимаю, почему при выполнении запроса удаляются обратные метки, даже после их экранирования. Здесь мой контекст обхода обратной галочки только из сценария оболочки, а не из запроса MySQL.

Это выполнимо?

Обновление: По запросу @shellter ниже приведенополный сценарий оболочки. И оболочка, заключающая весь запрос в одинарную кавычку, также выдает ту же ошибку. Также замена обратной галочки одинарной кавычкой приводит к синтаксической ошибке MySQL.

#!/bin/sh
cd `dirname $0`
ROOT_PATH=`pwd`
java -Dtalend.component.manager.m2.repository=$ROOT_PATH/../lib -Xms256M -Xmx1024M -cp .:$ROOT_PATH:$ROOT_PATH/../lib/routines.jar:$ROOT_PATH/../lib/activation.jar:$ROOT_PATH/../lib/crypto-utils.jar:$ROOT_PATH/../lib/dom4j-1.6.1.jar:$ROOT_PATH/../lib/log4j-1.2.17.jar:$ROOT_PATH/../lib/mail-1.4.jar:$ROOT_PATH/../lib/mysql-connector-java-5.1.30-bin.jar:$ROOT_PATH/projtablesync_0_1.jar: local.projtablesync_0_1.projTableSync  --context=Default  --context_param Email_To="username@gmail.com" --context_param Email_From="proj@gmail.com" --context_param Email_Cc="user2@gmail.com" --context_param smtp="smtp.gmail.com" --context_param processName="Tag" --context_param dropTempTableQry="drop table if exists reporting.details;" --context_param createTempTableQry="CREATE TABLE reporting.details AS SELECT * FROM \`Temp-17-09-19\`.details;" --context_param updateFinalTableQry="UPDATE  reporting.details AS a  INNER JOIN  reporting.details AS b  ON a.tag_id = b.tag_id AND a.seq_id = b.seq_id SET a.tag_submit_date = b.tag_submit_date, a.tag = b.tag, a.tag_update_date = b.tag_update_date, a.fail_code = b.fail_code, a.is_priority = b.is_priority, a.mobile_platform = b.mobile_platform, a.status = b.status, a.target_countries = b.target_countries, a.content_type = b.content_type, a.status_code = b.status_code, a.status_code_description = b.status_code_description;" --context_param insertFinalTableQry="INSERT INTO reporting.details SELECT a.* FROM reporting.details AS a LEFT JOIN reporting.details AS b ON a.Seq_id = b.Seq_id   AND IFNULL(a.tag_id, \"\") = IFNULL(b.tag_id, \"\") WHERE b.seq_id IS NULL;"

Спасибо.

1 Ответ

1 голос
/ 04 октября 2019

Вам нужно посмотреть, как java обрабатывает эти escape-символы, а также, '*' - специальный символ в bash / shell, его также нужно экранировать.

Вместо этого вы можете использовать одинарные кавычки (')of double, чтобы ничего не избежать и заставить shell / bash обрабатывать строку как есть (строковый литерал).

Например:

--context_param createTempTableQry='CREATE TABLE reporting.details AS SELECT * FROM `Temp-17-09-19`.details;'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...