2012-03-07 32 views
1

Oracleデータベースを使用しています。単一のselectクエリを使用してデータをフェッチしようとすると、データセット内に単一のテーブルが返されました。 2-3(複数の)テーブルを持つデータセットを取得できるOracleで選択クエリまたはプロシージャを作成するにはどうすればよいですか?複数の結果セットを返すためのOracleクエリ/ストアドプロシージャ

+0

は、uは2-3のテーブルを結合し、SELECT文を使用してデータを取得したいですか? – Teja

+0

テーブルが関連している場合と関連付けられていない場合があります。しかし、データベースのヒット数を減らすために、1回のヒットで複数のテーブルを取得したいと考えています。 – 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(); 

これらのテーブルに参加する必要がある場合は、通常の結合を使用してクライアント上で結果を分割することもできます(これは多くのORMがそれを行う方法です)。

+0

あなたのソリューションは本当に助けになりました。 – ABC

関連する問題