2011-11-29 81 views
8

我有一個ORACLE SQL sctipt,有幾個查詢和表,我想在程序開始時從我的java程序運行該腳本,以確保一切都在正確的位置。我找到了一個運行腳本的代碼,但由於某種原因它不起作用。任何人都可以提供樣品給我,以便我可以跟隨它。如何從java執行sql文件

這是我發現:

try { 
    String line; 
    Process p = Runtime.getRuntime().exec ("psql -U sas -d oracle -h @localhost -f Lab_05_Tables.sql"); 
    BufferedReader input =new BufferedReader(new InputStreamReader(p.getInputStream())); 

    while ((line = input.readLine()) != null) {   
     System.out.println(line); 
    } 
    input.close(); 
} 
catch (Exception err) { 
    err.printStackTrace(); 
} 

但它不工作,雖然。

錯誤

java.io.IOException: Cannot run program "psql": CreateProcess error=2, The system  
cannot find the file specified 
+3

什麼不起作用?你有錯誤嗎? – talnicolas

+0

格式化您的代碼,否則downvotes ... – Beginner

+1

是不是'psql'的PostgreSQL命令行?它也可以處理Oracle嗎? – Thilo

回答

5

如果您有資源,將SQL從腳本移植到Java程序本身會更好。

參見Java JDBC tutorial

+1

在你的java程序裏寫SQL是個壞主意!每次更改SQL語句或數據庫模式時,都需要重新編譯程序。 – GETah

+0

@GETah你如何參數化不在你的程序中的SQL?例如,如果您添加了新的表列,那麼您如何在JDBC的SQL的WHERE new_table =?部分中使用它?它可以使用某種元數據語言來完成,但大多數時候我不需要如此複雜的程度,因爲無論如何,DB方案的每一個變化都是因爲添加到Java代碼中的新特性而完成的,因此您需要重新編譯它無論如何。不過,如果你需要它,仍然可以完成。 –

+0

我寧願把我的SQL語句放在一個文本文件中。想象一下您需要重新命名數據庫中的表格的場景。在這種情況下,代碼不需要重新編譯,而當您直接將SQL嵌入到生產代碼中時,情況並非如此。 – GETah

2

您可能正在運行EnterpriseDB Postgres Plus Advanced Server,它允許您使用psql運行Oracle代碼。文件名「Lab_05_Tables.sql」提供了一個教育環境,所以請原諒我,如果我似乎過分地把你當作新手。

在使用Java進行工作之前,您應該讓您的執行語句在命令行中自行運行。

psql -U sas -d oracle -h @localhost -f Lab_05_Tables.sql 

很多事情在這裏可能是錯誤的,你需要弄清楚。您的命令行建議您希望在運行數據庫服務器的同一臺服務器上運行java程序,並且已安裝數據庫客戶端,並且您使用用戶名「sas」登錄名爲「oracle」的數據庫「不需要密碼。如果有任何不正確的地方,那麼在使用Java應用程序之前,應該先在數據庫中找到幫助。我會省略「-h @localhost」。

如果您確定所有工作正常並且問題的範圍只是讓Java執行您的命令,那麼您可能只需將psql添加到PATH環境變量。

+0

'psql'適用於PostgreSQL,如果只安裝了Oracle,它將不可用 - 如果是的話,它將無法連接到Oracle。 (和sqlplus的參數完全不同) –

+0

我明白了,對於普通的開源PostgreSQL來說,它與我提到的產品不同。請參閱http://enterprisedb.com/products-services-training/products/postgres-plus-advanced-server/advanced-server-oracle-features。 – phatfingers