在数据库开发中,临时表是存储中间结果的常用工具,尤其在处理复杂查询或需要分步计算时。在存储过程中创建临时表能够提高代码可读性、优化性能并减少重复计算,以下是关于这一操作的详细说明,结合不同数据库平台(如MySQL、SQL Server、Oracle)的实践方法。
局部临时表
仅在当前会话或存储过程中可见,会话结束后自动删除。
示例命名:
#TempTable
TEMPORARY TABLE TempTable
全局临时表
对所有会话可见,但仅在所有引用它的会话关闭后删除(仅限SQL Server)。
示例命名:##GlobalTempTable
CREATE PROCEDURE dbo.ExampleProc AS BEGIN -- 创建局部临时表 CREATE TABLE #EmployeeTemp ( ID INT, Name NVARCHAR(50), Salary DECIMAL(10,2) ); -- 插入数据 INSERT INTO #EmployeeTemp SELECT EmployeeID, FirstName, Salary FROM Employees WHERE Department = 'Sales'; -- 使用临时表进行计算 SELECT AVG(Salary) AS AvgSalary FROM #EmployeeTemp; -- 显式删除(可选,会话结束自动删除) DROP TABLE #EmployeeTemp; END
DELIMITER $$ CREATE PROCEDURE ExampleProc() BEGIN -- 创建临时表(自动添加TEMPORARY关键字) CREATE TEMPORARY TABLE TempSales ( ProductID INT, Quantity INT ); -- 插入数据并关联查询 INSERT INTO TempSales SELECT ProductID, SUM(Quantity) FROM Orders GROUP BY ProductID; -- 输出结果 SELECT * FROM TempSales; -- MySQL自动删除临时表 END $$ DELIMITER ;
CREATE OR REPLACE PROCEDURE ExampleProc AS BEGIN -- 使用全局临时表(需预定义结构) INSERT INTO GlobalTempEmployees SELECT EmployeeID, Name FROM Employees WHERE HireDate > SYSDATE - 30; -- 提交后数据保留(取决于定义时的ON COMMIT选项) COMMIT; END;
明确作用域需求
资源管理与性能
避免常见错误
ON COMMIT DELETE ROWS
,数据可能残留。 限制
替代方案