2015-01-14 36 views
0

我有一個本地運行的oracle瘦客戶端,並已成功創建一個ruby腳本來連接到遠程oracle數據庫。我成功地撥打電話(選擇TABLE_NAME *)到數據庫中得到一個表的內容:執行一個sql腳本vi一個OCI8連接對象

begin 
    con = OCI8.new('<user>', <password>, '<host>:<port>/XE') 
    con.exec('select name from actor') do |records| 
     puts records 
    end 
rescue OCIError 
    puts "Database Connection Error" 
end 

我也想運行駐留在遠程主機上的Oracle目錄中的SQL腳本。 通常我執行以下操作:

su - oracle 
sqlplus <user>/<password> 
<SQL> @<script_name> 

,這將運行腳本

在Ruby腳本我嘗試以下方法:

con.exec('@<script_name>') 

不過,我得到以下錯誤:

stmt.c:230:in oci8lib_200.bundle: ORA-00900: invalid SQL statement (OCIError)  

回答

0

你可以把這個腳本放在一個函數中(FUNCTION_NAME),並執行

con.exec("select function_name from dual") 
1

@<script_name>是SQLPLUS命令。 當sqlplus找到@<script_name>時,它會打開<script_name>,將其內容劃分爲SQL語句並執行它們。 如果您想通過ruby在腳本中運行SQL語句,您需要編寫代碼來打開腳本,分割其內容並逐個將SQL語句傳遞到con.exec

I also want to run an sql script that resides in the oracle directory on the remote host. Usually I perform the following:

不,它不能。 sqlplus讀取駐留在本地主機上的sql腳本。

+0

謝謝@Albert。與此同時,我改變了連接到我的實例的寶石。現在我正在使用net-ssh ruby​​ gem。並運行以下命令:ssh.exec!(「su - oracle -c'sqlplus /'<< EOF \ n#{} \ nEOF \ n」) – roland