2012-03-07 2 views
1

Oracle 데이터베이스를 사용하고 있습니다. 단일 선택 쿼리를 사용하여 데이터를 가져 오려고 시도하면 데이터 집합에 단일 테이블이 반환됩니다. 오라클에서 선택 쿼리 또는 프로 시저를 작성하는 방법, 여기서 2-3 (다중) 테이블을 가진 데이터 세트를 얻을 수 있습니까?여러 개의 결과 집합을 반환하는 Oracle 쿼리/저장 프로 시저

+0

유 2 ~ 3 개 테이블을 조인하고 SELECT 문을 사용하여 데이터를 얻을시겠습니까? – Teja

+0

테이블이 관련이 있거나 다를 수 있습니다. 그러나 데이터베이스 히트 수를 줄이기 위해 단일 히트에서 여러 개의 테이블을 얻고 싶습니다. – ABC

+0

테이블은 무엇이며 무엇을 시도 했습니까? –

답변

1

이것은 내가, 그것은 아주 간단 무슨 짓을했는지 정확히 :

 Database db = DatabaseFactory.CreateDatabase("ConnectionString"); 
     object[] results = new object[3]; 
     DbCommand cmd = db.GetStoredProcCommand("DATABASE.SELECT_JOB_HISTORY.GetJobHistoryByEmployeeId",results);    
     DataSet ds = db.ExecuteDataSet(cmd); 
     DataTable dt1 = ds.Tables[0]; 
     DataTable dt2 = ds.Tables[1]; 
4

나는 당신이 당신의 데이터베이스에 대한 왕복을 줄이기를 원한다고 생각하는 한 멀리 생각했다. 이것은 다음과 같은 방법으로 저장 프로 시저에 의해 수행 할 수 있습니다

http://msdn.microsoft.com/en-us/library/ms971506.aspx#msdnorsps_topic6

패키지 헤더 :

CREATE OR REPLACE PACKAGE SELECT_JOB_HISTORY AS 
TYPE T_CURSOR IS REF CURSOR; 
PROCEDURE GetJobHistoryByEmployeeId 
(
    p_employee_id IN NUMBER, 
    cur_JobHistory OUT T_CURSOR 
); 
END SELECT_JOB_HISTORY; 

패키지 :

CREATE OR REPLACE PACKAGE BODY SELECT_JOB_HISTORY AS 
PROCEDURE GetJobHistoryByEmployeeId 
(
    p_employee_id IN NUMBER, 
    cur_JobHistory OUT T_CURSOR 
) 
IS 
BEGIN 
    OPEN cur_JobHistory FOR 
    SELECT * FROM JOB_HISTORY 
     WHERE employee_id = p_employee_id; 

END GetJobHistoryByEmployeeId; 
END SELECT_JOB_HISTORY; 

클라이언트 :

// create connection 
OracleConnection conn = new OracleConnection("Data Source=oracledb; 
    User Id=UserID;Password=Password;"); 

// create the command for the stored procedure 
OracleCommand cmd = new OracleCommand(); 
cmd.Connection = conn; 
cmd.CommandText = "SELECT_JOB_HISTORY.GetJobHistoryByEmployeeId"; 
cmd.CommandType = CommandType.StoredProcedure; 

// add the parameters for the stored procedure including the REF CURSOR 
// to retrieve the result set 
cmd.Parameters.Add("p_employee_id", OracleType.Number).Value = 101; 
cmd.Parameters.Add("cur_JobHistory", OracleType.Cursor).Direction = 
    ParameterDirection.Output; 

// open the connection and create the DataReader 
conn.Open(); 
OracleDataReader dr = cmd.ExecuteReader(); 

// output the results and close the connection. 
while(dr.Read()) 
{ 
    for(int i = 0; i < dr.FieldCount; i++) 
     Console.Write(dr[i].ToString() + ";"); 
    Console.WriteLine(); 
} 
conn.Close(); 

이 테이블에 가입해야하는 경우 일반 조인을 사용하여 결과를 클라이언트에서 분할 할 수 있습니다 (imho가 많은 ORM에서 수행하는 방식 임).

+0

감사합니다. Eggi, 귀하의 솔루션이 실제로 도움이되었습니다. – ABC

관련 문제