плохо размещены () при создании ссылки на базу данных Oracle в tcsh - PullRequest
2 голосов
/ 03 января 2012
#my code

echo \
'create database link remotec101 \
connect to "os_user" \
identified by "password" \
using ' \
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) \
(HOST=c101) \
(PORT=1521)) \
(CONNECT_DATA=(SID=XE)))';'|sqlplus

Я попытался запустить некоторые sql таким образом, и это сработало.Но при создании ссылки на базу данных я получил сообщение об ошибке: «плохо помещено» (*)

Этот код находится в tcsh.

Пожалуйста, помогите мне.

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Скобки не заключены в кавычки, поэтому они обрабатываются как метасимволы оболочки.

This:

echo \
'create database link remotec101 \
connect to "os_user" \
identified by "password" \
using \
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) \
(HOST=c101) \
(PORT=1521)) \
(CONNECT_DATA=(SID=XE)));' | sqlplus

будет передавать следующую команду sqlplus:

create database link remotec101 
connect to "os_user" 
identified by "password" 
using 
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) 
(HOST=c101) 
(PORT=1521)) 
(CONNECT_DATA=(SID=XE)));

Но «здесь документ», вероятно, чище:

sqlplus <<'EOF'
create database link remotec101
connect to "os_user"
identified by "password"
using
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)
(HOST=c101)
(PORT=1521))
(CONNECT_DATA=(SID=XE)));
'EOF'

Если вы хотите, чтобы последние 4 строки стали одной строкой ввода для sqlplus, я думаю, вам нужнопоместите их все в одну строку в вашем скрипте.Или вам может быть проще использовать команду printf для организации вывода, например:

printf '%s\n%s\n%s\n%s\n%s %s %s %s\n' \
    'create database link remotec101' \
    'connect to "os_user"' \
    'identified by "password"' \
    'using' \
    '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)' \
    '(HOST=c101)' \
    '(PORT=1521))' \
    '(CONNECT_DATA=(SID=XE)));' | sqlplus

Это печатает последние 4 строки как одну строку.Вы можете настроить формат строки при необходимости.

1 голос
/ 03 января 2012

Я понял это.Вы должны использовать тот факт, что tcsh поддерживает оба типа кавычек, а echo допускает несколько аргументов:

echo 'create database link remotec101 \
connect to "os_user" \                                                          
identified by "password" \                                                      
using ' "'" ' ( DESCRIPTION= ( ADDRESS= ( PROTOCOL=TCP )
 ( HOST=c101 ) 
 ( PORT=1521 ) ) 
 ( CONNECT_DATA= ( SID=XE ) ) ) ' "';"
...