Oracle-10g
在 C# 中執行 PL/SQL 腳本塊
我正在嘗試使用 .Net 中的 OracleClientProvider 來執行 PL/Sql 塊。我使用的語言是c#,數據庫是oracle10g
我實際上在做的是以下內容:
//ConnectionSting is the connection String OracleConnection connection = new OracleConnection(connectionString); OracleCommand cmd = new OracleCommand(); cmd.Connection = connection; // Open the connection connection.Open(); //queryFile contains the PL/SQL Script I am trying to execute; String queryFile = ConfigurationManager.AppSettings["MasterDbScript"]; String dataInFile = new StreamReader(queryFile).ReadToEnd(); cmd.CommandText = dataInFile; connection.Open(); cmd.ExecuteNonQuery(); //close the connection connection.close();
當我通過 ORACLE 客戶端執行 PL/SQL 塊時,它可以正確執行,但在這裡它會拋出錯誤 ORA-00922: missing or invalid option
我想問: 1. 腳本的執行方式與普通查詢不同嗎?2.我做錯了什麼?
建議/答案
謝謝。
由於您沒有向我們展示您的腳本,讓我們反過來工作。在您的數據庫中創建一個表
Create table Test_call_count ( count number(10) ); insert into Test_call_count values (0);
並將以下內容放入您的腳本文件中
update Test_call_count set count = count + 1;
執行程式碼後,您可以通過從數據庫中選擇來檢查它是否有效。
下一步將使用一些開始結束;塊不返回任何結果集。
通常 Ado 不能處理整個腳本。使用 sql-server 它可以處理批處理,這些批處理是由 go 語句分隔的腳本的一部分。據我所知,對於 Oracle,它只能處理單個 sql 語句或開始結束塊。
編輯:這是一個小 PowerShell,你可以用它來嘗試什麼是可能的:
if ($ora_loaded -eq $null) { $ora_loaded = [System.Reflection.Assembly]::LoadWithPartialName("Oracle.DataAccess") } $ConnectionString = "Data Source=YOUR_TNS;User ID=YOUR_ID;Password=YOUR_Password" function Execute-Query { param ( $sql ) $conn = new-object Oracle.DataAccess.Client.OracleConnection $conn.ConnectionString = $ConnectionString $cmd = new-object Oracle.DataAccess.Client.OracleCommand($sql,$conn) # $cmd.CommandTimeout=$timeout $ds = New-Object system.Data.DataSet $da = New-Object Oracle.DataAccess.Client.OracleDataAdapter($cmd) $nuLL = $da.fill($ds) $ds.tables[0] Write-Host '' } function Execute-NonQuery { param ( $sql ) $conn = new-object Oracle.DataAccess.Client.OracleConnection $conn.ConnectionString = $ConnectionString $cmd = new-object Oracle.DataAccess.Client.OracleCommand($sql,$conn) $conn.open() # $cmd.CommandTimeout=$timeout $cmd.ExecuteNonQuery() $conn.close() } Execute-Query "select * from Test_call_count;" Execute-NonQuery "update Test_call_count set count = count + 1" Execute-NonQuery "begin update Test_call_count set count = count + 1; end;"
例如,您會看到以下失敗(我添加了一個分號):
Execute-NonQuery "update Test_call_count set count = count + 1;"
這也失敗了:
Execute-NonQuery "begin update Test_call_count set count = count + 1; end; /"
在第一個近似值中,您可以將“/”視為類似於 sql-server 批處理分隔符 go。