Oracle запрос / хранимая процедура для возврата нескольких наборов результатов - PullRequest
1 голос
/ 07 марта 2012

Я использую базу данных оракула. Когда я попытался извлечь данные с помощью одного запроса на выборку, он вернул одну таблицу в наборе данных. Как написать запрос или процедуру выбора в Oracle, где я могу получить набор данных с 2-3 (несколькими) таблицами?

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

Насколько я понял ваш вопрос, вы хотели бы сократить количество обращений к вашей базе данных. Это можно сделать с помощью хранимой процедуры следующим образом:

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).

2 голосов
/ 09 марта 2012

Это именно то, что я сделал, это было довольно просто:

        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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...