2015-05-11 97 views
1

我想要做的是創建一個打開sqlplus,連接到遠程服務器並執行數據庫重新編譯的進程。使用進程在客戶端服務器上執行utl_recomp

string arg =     
     "\"conn " + myConnect + " as sysdba \""+ 
     "\"begin UTL_RECOMP.RECOMP_SERIAL('" + mySchema + "'); end;\""; 

Process pro = new Process() 
pro.StartInfo.FileName = "sqlplus.exe"; 
pro.StartInfo.Arguments = arg; 
pro.StartInfo.EnvironmentVariables["ORACLE_HOME"] = Srvr.OH; 
pro.StartInfo.UseShellExecute = false; 
pro.StartInfo.RedirectStandardOutput = true; 
pro.StartInfo.RedirectStandardError = false; 
pro.Start(); 
pro.WaitForExit(); 

該進程運行但我的對象仍然無效。我已經遠程連接並從命令行以sysdba的身份成功運行了此sql語句。有任何想法嗎?

+0

我猜你打算使用轉義序列,而你的一個字符串沒有。擺脫@前綴。 – Zer0

+0

@前綴被用作以前的字符串文字。我在這裏編輯它,並從我的源代碼中刪除,但仍然是同樣的問題。感謝您指出了Zer0。 –

+0

哪些對象無效,爲什麼?看看'select * from dba_errors where owner ='MYSCHEMA';'。這可能是單獨重新編譯並不能解決問題。 –

回答

0
string mySqlPath = path + ".sql"; 
string mysql = "begin UTL_RECOMP.RECOMP_SERIAL('" + mySchema + "'); end;"; 

string arg = 
     " /c echo/| " + pathway +"sqlplus.exe"    
     " -silent " + myConnect + " as sysdba" + 
     "@" + mysql; 

StreamWriter strWr = new StreamWriter(mySqlPath); 
strWr.WriteLine(mysql); 
strWr.WriteLine("/"); 
strWr.Close(); 

Process pro = new Process() 
pro.StartInfo.FileName = "cmd"; 
pro.StartInfo.Arguments = arg; 
pro.StartInfo.EnvironmentVariables["ORACLE_HOME"] = Srvr.OH; 
pro.StartInfo.UseShellExecute = false; 
pro.StartInfo.RedirectStandardOutput = true; 
pro.StartInfo.RedirectStandardError = false; 
pro.Start(); 
pro.WaitForExit(); 

這適用於遠程重新編譯!嘗試弄清楚它是否有很長的路要走,但你必須添加更多的代碼。文件名中的「cmd」要求我關閉數據庫,裝入數據庫,更改數據庫歸檔日誌,更改數據庫閃回,修改數據庫打開,然後退出。重新編譯成功完成,以及我的驗證過程,該過程返回0行選作'INVALID'。

相關問題