SQL中的子程序有两种类型:
CALL/EXEC调用,并不总是在select层中使用。重要:
标量函数示例(PostgreSQL):
CREATE FUNCTION get_tax(amount NUMERIC, rate NUMERIC DEFAULT 0.13) RETURNS NUMERIC AS $$ BEGIN RETURN amount * rate; END; $$ LANGUAGE plpgsql; -- 使用: SELECT *, get_tax(price) AS tax FROM product;
存储过程示例(SQL Server):
CREATE PROCEDURE add_employee(@name NVARCHAR(100), @salary INT, @emp_id INT OUTPUT) AS BEGIN INSERT INTO employees (name, salary) VALUES (@name, @salary); SET @emp_id = SCOPE_IDENTITY(); END; DECLARE @id INT; EXEC add_employee 'John', 100000, @id OUTPUT;
可以直接在SELECT中使用存储过程吗?
人们常回答"可以",但这是错误的。
答案:
EXEC/CALL),而函数可以在SELECT中使用。故事
项目: 初始账务系统,实现报告。 错误: 为计算总和编写了过程而不是函数 — SELECT无法工作,必须重写所有用户报告的逻辑。
故事
项目: 具有外部参数的ERP系统。 错误: 对过程未设置OUT关键字,导致客户端无法获取添加记录的ID,集成"崩溃"。
故事
项目: 根据不同规则计算税收的金融服务。 错误: 在大规模查询中使用标量函数而未进行性能测试 — 查询因逐行调用而减慢处理速度(未优化计划)。