Oracle-10g

在 C# 中執行 PL/SQL 腳本塊

  • February 17, 2011

我正在嘗試使用 .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。

引用自:https://dba.stackexchange.com/questions/1258