2017-05-02 1 views
0

Ich möchte mehrere Abfragen in ODP.Net mit einer Select-Anweisung enden. Ich lösche, aktualisiere und wähle dann aus einer Tabelle aus.Ausführen mehrerer Abfragen in Oracle mit ODP.Net

Als Beispiel:

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; 

Dies funktioniert in SQL Developer, aber nicht ODP.Net. Ich bekomme diese Fehlermeldung:

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

Aber wenn ich das entfernen/I erhalten:

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

Ist das, was ich überhaupt möglich machen wollen? Ich möchte nicht ein Paket erstellen und damit anfangen, Typen zu erstellen. Idealerweise möchte ich dies über .Net tun.

+0

Sie können es nicht so machen. Entweder legen Sie alles in einen gespeicherten Prozess und geben die Auswahl als Cursor zurück oder brechen in zwei Ausführungen auf. – OldProgrammer

+0

Wie OldProgrammer vorschlägt, verwenden Sie die SQL * Plus-Syntax (den umgekehrten Schrägstrich), die für SQL Developer und ähnliche Tools geeignet ist, jedoch nicht für programmatische Schnittstellen. Sie können anonymes PLSQL von ODP.NET mit Bindevariablen aufrufen. Sie können das Ganze in einen anonymen PL/SQL-Block schreiben und am Ende an einen REF CURSOR binden. Dann hole es ab. –

+0

Hier ist ein Beispielcode, der zeigt, wie man einen anonymen plsql-Block von odp.net aufruft und dann an einen ref-Cursor bindet: http://www.oracle.com/partners/campaign/o16odpnet-087852.html –

Antwort

0

Im Gegensatz zu SQL Server mit t-sql hat Oracle zwei Kontexte, SQL Plus und PL/SQL (Anfang/Ende ist ein anonymer plsql-Block, wobei die ausgewählte Außenseite SQL Plus wäre). Ich habe noch keine Möglichkeit gefunden, einen Satz aus einer SQL Plus-Abfrage zurückzugeben, nachdem ein PLSQL-Block gestartet wurde.

Sie können jedoch sicherlich tun all das in einem plsql Block und einen Ref Cursor zurück:

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]); 

} 

Mehr Infos hier: http://www.brothersincode.com/post/executing-SQL-Plus-Batches-from-Net.aspx

Ihr spezieller Fall möchte so etwas wie:

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(); 

} 
Verwandte Themen