2012-01-02 55 views
2
#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中創建oracle數據庫鏈接時發生了錯誤()的問題

此代碼是在tcsh。

請幫幫我。

謝謝

+0

的括號外的字符串被呼應,所以由殼解析。你有沒有把連接信息放在字符串之外的原因? – 2012-01-02 20:19:45

回答

2

括號沒有引用,所以它們被視爲shell元字符。

此:

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

我認爲OP的問題是希望最後四行是字符串內的字符串 – Dan 2012-01-02 20:31:56

+0

@Dan:我不確定「字符串內的字符串」是什麼意思。如果OP告訴我們他想要'sqlplus'命令在其stdin上看到什麼,這將有所幫助。 (如果我知道'sqlplus'的期望,這也將有所幫助。) – 2012-01-02 21:52:32

+0

對不起,我的意思是,它們將一個字符串傳遞給echo命令?但在此之內,特別是帶括號的部分,他們需要一個字符串。換句話說,看起來不屬於他們的那兩個撇號實際上是「回聲」意思的一部分。我發佈了一個回覆,用'\\'轉義它們,但顯然這在tcsh中不起作用。 – Dan 2012-01-02 21:54:26

1

我想通了。你必須利用了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))) ' "';"