Выполните много команд db2 в одной команде - PullRequest
0 голосов
/ 01 октября 2019

могу ли я запустить несколько команд db2 в одной команде? то есть: из cmd:

db2cmd /c db2 /c connect to sample user sample_user using sample_pwd /c 
"SELECT * FROM table;"

Я также пробовал следующее:

db2 connect to sample user db2admin using pwd; EXPORT TO result.csv OF DEL 
MODIFIED BY NOCHARDEL SELECT * FROM alarms;

, но не работал со следующей ошибкой:

SQL0104N Anнеожиданный токен "EXPORT" был найден после "". Ожидаемые токены могут включать: «NEW». SQLSTATE = 42601

, например, для VERTICA, инструмента vsql, это можно сделать следующим образом:

vsql -h localhost -U user -w pwd -c "SELECT * FROM alarms" -A -o 
"alarms.csv" -F "|" -P footer=off -q

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Вы, похоже, используете Microsoft Windows db2cmd.exe.

Ваш вопрос не имеет ничего общего с Db2, но вместо этого он больше касается синтаксиса сценариев CMD (cmd.exe), унаследованногоязык сценариев для пакетных файлов Microsoft, который по-прежнему работает в Windows-10 и также работает в db2cmd.exe.

В оболочке db2cmd.exe вы можете использовать последовательность «&&» между различными командами Db2 (икаждая такая команда должна иметь префикс db2). Кроме того, каждая такая командная строка должна экранировать любые символы, которые специальные символы , в самой оболочке. По умолчанию escape-символ является символом вставки (^).

Например, db2 connect to dbname && db2 ^"export to alarms.csv of del ... select ^* from alarms^" && db2 connect reset

(я показываю ^ перед любым ", который вы, возможно, захотите передать в Db2-CLP).

Но для этого && потребуется, чтобы каждая команда возвращала нулевой код выхода, что может быть не тем, что вы хотите, хотя обычно это самый безопасный вариант. Если предыдущая команда не выполняется, последующие команды не будут выполняться.

Если вы хотите допустить использование ненулевых кодов выхода, используйте скобки ( ... ) для группировки команд, а затем используйте && или & вне скобок в зависимости от ваших требований. Вы можете прочитать оСценарии CMD в любой хорошей книге, множество примеров в Интернете.

Однако при написании сценариев для Db2 в Windows гораздо разумнее добавить все команды (без префикса Db2) в простой текстовый файл,и затем попросите Db2 clp выполнить текстовый файл с помощью синтаксиса db2 -tvf texfile. Делая это таким образом, вы можете добавить условную логику в текстовый файл, обрабатывать исключения, избегать оболочки escaтребования пинга и т. д. Если вы инкапсулируете всю свою логику в сценарии, это упрощает тестирование, а также облегчает запуск из одной командной строки db2cmd /c .....

Если вы хотите создать пакетфайл (* .bat или * .cmd), для вызова которого не требуется префикс db2cmd, вы можете изменить свой пакетный файл так, чтобы в начале пакетного файла было несколько строк для повторного выполнения самого себя с помощью db2cmd.exe,Это работает лучше, если ваш db2cmd.exe уже находится в переменной окружения PATH, но если это не так, вы можете полностью указать абсолютный путь к вашему db2cmd.exe в командном файле. Строки, добавляемые в начале пакетного файла:

@rem re-execute via db2cmd if running from cmd.exe
@echo off
if "%DB2CLP%"=="" db2cmd /c /i /w "%0" %* & goto :EOF
db2 connect to sample user db2admin using pwd
if errorlevel 1 @echo "Failed to connect to database " && @goto :EOF
db2 "EXPORT TO result.csv OF DEL MODIFIED BY NOCHARDEL SELECT * FROM alarms"
if errorlevel 3 @echo "Export from Db2 failed" && @goto :EOF

Кроме того, в Windows вы можете использовать скрипты Powershell для манипулирования базами данных Db2, а также использовать подсистему Windows для Unix для запуска в стиле Unix. сценарии оболочки в некоторой конфигурации.

0 голосов
/ 01 октября 2019

Два варианта.

1-й:

db2cmd /i /w /c "db2 ^"connect to sample^" & db2 ^"values 1^" & db2 connect reset"

2-й:
Вы можете установить следующую системную переменную среды Windows DB2CLP в значение **$$**и сразу после этого запускайте команды db2 из windows cmd следующим образом:

db2 "connect to sample" & db2 "values 1" & db2 connect reset
0 голосов
/ 01 октября 2019

Самое прямое сравнение вашего примера в Db2-land было бы clpplus , которое позволяет вам указать базу данных, но вы также должны предоставить информацию для входа (включая пароль или вас могут попросить).

В рамках db2cmd и db2 у вас есть пара вариантов, но, скорее всего, вы захотите использовать файл сценария.

Один вариант: задайте для переменной реестра DB2DBDFT базу данных по умолчанию. Лично мне не нравится эта опция, потому что она вызывает неявное соединение с базой данных, которое вы, возможно, не планировали.

Один вариант: поместите вашу серию команд в файл и запустите этот файл. Это более традиционный способ запуска нескольких команд. Команды могут заканчиваться точкой с запятой и символом новой строки (здесь понимаются различия DOS и Unix). Вы можете использовать другой терминатор, используя -td @ (например). Затем вы вызываете db2 -tf file.sql.

Один из вариантов: командный файл. Это похоже на описанное выше, но вы будете использовать среду db2cmd для выполнения пакета, в котором есть команды db2. db2cmd предоставляет вам подходящую среду для работы с Db2. Если вы подключаетесь к базе данных в этой среде, вы остаетесь на связи до тех пор, пока не выполните принудительное отключение CONNECT RESET, TERMINATE или выход из вашей среды. Таким образом, ваш пакетный файл будет просто иметь:

db2 connect to sample user db2admin using pwd
db2 "EXPORT TO result.csv OF DEL MODIFIED BY NOCHARDEL SELECT * FROM alarms"

(обратите внимание на кавычки, чтобы в командной строке не подставлялись все имена файлов в текущем рабочем каталоге, где находится *)

...