【问题标题】:Oracle query/ stored procedure to return multiple resultsetsOracle查询/存储过程返回多个结果集
【发布时间】:2012-03-07 05:17:11
【问题描述】:

我正在使用 oracle 数据库。当我尝试使用单个选择查询获取数据时,它返回数据集中的单个表。 如何在 oracle 中编写选择查询或过程,我可以在其中获取包含 2-3(多个)表的数据集?

【问题讨论】:

  • 你想加入 2-3 个表并使用 SELECT 语句获取数据吗?
  • 这些表可能相关也可能不相关。但只是为了减少数据库点击次数,我想在一次点击中获得多个表。
  • 你的桌子是什么,你试过什么?
  • 当我尝试执行一个简单的 selecte 查询,如 'select * from table1' 时,我可以得到以下输出:DataSet ds = db.ExecuteDataSet(dbc);数据表 dt= ds.Tables[0];这样,我只得到一张桌子。但是现在我想在单次点击中获得多个查询的结果。例如,Select * from table1;从表2中选择*;这样我就可以得到: DataSet ds = db.ExecuteDataSet(dbc);数据表 dt1= ds.Tables[0];数据表 dt2= ds.Tables[1];
  • 这里你会得到解决方案..niharstechnicalfunda.blogspot.in/#!/2013/06/…

标签: asp.net oracle


【解决方案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];

【讨论】:

    【解决方案2】:

    据我了解,您希望减少数据库的往返次数。 这可以通过存储过程以下列方式完成:

    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 的做法)。

    【讨论】:

    • 感谢 Eggi,您的解决方案真的很有帮助。
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2012-07-19
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多