存儲過程中只有幾條 SELECT 語句,無 INSERT/UPDATE,Oracle 中無意義,但 SQL Server 中常見。
CREATE PROC GetDashboardData
AS
BEGIN
SELECT * FROM Sales WHERE Year = 2023; -- 結果集 0
SELECT * FROM TopCustomers; -- 結果集 1
SELECT COUNT(*) AS TotalOrders FROM Orders; -- 結果集 2
END
C# 調用:
var ds = new DataSet();
using (var da = new SqlDataAdapter("GetDashboardData", conn)) {
da.SelectCommand.CommandType = CommandType.StoredProcedure;
da.Fill(ds); // ds.Tables[0] = Sales, [1] = TopCustomers, [2] = TotalOrders
}
Fill 或多個命令。| SQL Server | Oracle 等效 |
|---|---|
| 多 SELECT 存儲過程 | 包含 SYS_REFCURSOR OUT 參數的 Package/Procedure |
| DataAdapter.Fill(DataSet) | OracleDataAdapter.Fill(DataSet) 自動映射 REF CURSOR 到 Tables |
-- Oracle Package
CREATE OR REPLACE PACKAGE PKG_DASH AS
PROC_GET_DATA (
p_sales OUT SYS_REFCURSOR,
p_cust OUT SYS_REFCURSOR,
p_ord OUT SYS_REFCURSOR
);
END;
-- C# 調用
cmd.Parameters.Add("p_sales", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
// ... da.Fill(ds) 自動生成 ds.Tables[0], [1], [2]
SELECT 順序,修改存儲過程時同步調整 .NET 索引。ExecuteReader + NextResult()) 避免內存壓力。