2017-05-02 28 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

이렇게하면 안됩니다. 저장 프로 시저에 모든 것을 넣고 선택을 커서로 반환하거나 두 번의 실행으로 나눕니다. – OldProgrammer

+0

OldProgrammer가 제시 하듯이, SQL Developer 및 유사한 도구에는 괜찮지 만 프로그램 인터페이스에는 적합하지 않은 SQL * Plus 구문 (백 슬래시)을 사용하고 있습니다. 바인드 변수를 사용하여 ODP.NET에서 익명의 PLSQL을 호출 할 수 있습니다. 모든 것을 하나의 익명 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이라는 두 가지 컨텍스트를 가지고 있습니다 (begin/end는 익명 plsql 블록이며 select 외부는 SQL Plus입니다). 나는 아직 plsql 블록이 시작된 후 SQL Plus 쿼리에서 집합을 반환하는 방법을 찾지 못했습니다.

그러나, 당신은 PLSQL 블록에 모든 걸하고 REF 커서를 반환 확실히 할 수

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

} 
여기

더 많은 정보 :

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

특정 사건과 같은 일을하고 싶습니다

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

}