2017-05-02 10 views
0

ODP.Netで複数の問合せを実行できるようにするには、select文で終了します。私はクリアし、更新してからテーブルから選択します。一例として、ODP.NetでOracleで複数の問合せを実行する

BEGIN 
    DELETE FROM StagingTable; 

    INSERT INTO StagingTable (Col1,Col2,Col3) 
    SELECT Value1,Value2,Value3 
    FROM MainTable; 

    UPDATE StagingTable 
    SET Col1 = FUNCTION(Col1); 
END; 
/
SELECT * FROM StagingTable; 

これは、SQL Developerで動作しますが、ODP.NETではありません。私はこのエラーを取得:

ORA-06550: line 26, column 1: PLS-00103: Encountered the symbol "/"

をしかし、私は削除する場合は/私が取得:

ORA-06550: line 27, column 1: PLS-00103: Encountered the symbol "SELECT"

は、私も可能何をしたいですか?私はパッケージを作成して型の作成などをしなければならないとは思わない。理想的には私は.Net経由でこれをやりたい

+0

そんなことはできません。ストアドプロシージャにすべてを格納し、カーソルとしてセレクトを返すか、2回の実行に分割します。 – OldProgrammer

+0

OldProgrammerが示唆しているように、SQL * Plus構文(バックスラッシュ)を使用していますが、これはSQL Developerなどのツールでは有効ですが、プログラマチック・インタフェースでは使用できません。バインド変数を使用してODP.NETから匿名PLSQLを呼び出すことができます。全体を1つの無名PL/SQLブロックに入れ、最後にREF CURSORにバインドすることができます。その後、それから取り出します。 –

+0

odp.netから匿名のplsqlブロックを呼び出し、次に参照カーソルにバインドするコードの例をいくつか示します。http://www.oracle.com/partners/campaign/o16odpnet-087852.html –

答えて

0

t-sqlを使用するSQL Serverとは異なり、oracleにはSQL PlusとPL/SQLという2つのコンテキストがあります(begin/endは匿名のplsqlブロックで、select外部はSQL Plusになります)。私はまだplsqlブロックの開始後にSQL Plusクエリからセットを返す方法を見つけ出していません。

しかし、あなたは確かにPLSQLブロックでそのすべてを行うと、参照カーソルを返すことができます。

:あなたの特定のケースのようなものをしたいと思い http://www.brothersincode.com/post/executing-SQL-Plus-Batches-from-Net.aspx

:ここ

OracleCommand cmd = new OracleCommand(
    @" 
    declare 
     localUseVar varchar(50); 
    begin 
     select dummy into localUseVar from dual; 

     open :refcursor for 
     select dummy, localUseVar FROM DUAL 
     where :fakeparam=:fakeparam; 
     end; 
    "); 
cmd.BindByName = true; 
cmd.Parameters.Add("fakeparam", "fake"); 
cmd.Parameters.Add("refcursor", OracleDbType.RefCursor).Direction = System.Data.ParameterDirection.Output; 

using (cmd.Connection = new OracleConnection("DATA SOURCE=localhost:1521/xe; PERSIST SECURITY INFO = True; USER ID = TEMPLATE; Password=password")) 
{ 
    cmd.Connection.Open(); 
    var reader = cmd.ExecuteReader(); 
    Assert.IsTrue(reader.Read()); 
    Assert.AreEqual(reader[0], reader[1]); 

} 

さらに詳しい情報

OracleCommand cmd = new OracleCommand(
@" 
begin 
    DELETE FROM StagingTable; 

    INSERT INTO StagingTable (Col1,Col2,Col3) 
    SELECT Value1,Value2,Value3 
    FROM MainTable; 

    UPDATE StagingTable 
    SET Col1 = FUNCTION(Col1); 

    open :refcursor for SELECT * FROM StagingTable; 
end; 
"); 
cmd.BindByName = true; 
cmd.Parameters.Add("refcursor", OracleDbType.RefCursor).Direction = System.Data.ParameterDirection.Output; 

using (cmd.Connection = new OracleConnection("DATA SOURCE=localhost:1521/xe; PERSIST SECURITY INFO = True; USER ID = TEMPLATE; Password=password")) 
{ 
    cmd.Connection.Open(); 
    var reader = cmd.ExecuteReader(); 

} 
関連する問題