SQL 函数创建详解

SQL 函数是可重用的代码块,可以接受参数、执行操作并返回结果。函数可以简化复杂查询,提高代码复用性。以下是 SQL 函数创建的全面指南。

1. 函数基本语法

sql

复制

下载

CREATE [OR REPLACE] FUNCTION function_name ([parameter_list])

RETURNS return_datatype

[LANGUAGE language_name]

AS $$

-- 函数体

DECLARE

-- 变量声明

BEGIN

-- 执行逻辑

RETURN return_value;

END;

$$;

2. 函数类型

2.1 标量函数 (返回单个值)

sql

复制

下载

CREATE FUNCTION get_employee_name(emp_id INT)

RETURNS VARCHAR

AS $$

DECLARE

emp_name VARCHAR(100);

BEGIN

SELECT name INTO emp_name FROM employees WHERE id = emp_id;

RETURN emp_name;

END;

$$ LANGUAGE plpgsql;

2.2 表值函数 (返回表)

sql

复制

下载

CREATE FUNCTION get_department_employees(dept_id INT)

RETURNS TABLE (

emp_id INT,

emp_name VARCHAR(100),

emp_salary DECIMAL(10,2)

)

AS $$

BEGIN

RETURN QUERY

SELECT id, name, salary

FROM employees

WHERE department_id = dept_id;

END;

$$ LANGUAGE plpgsql;

3. 参数类型

3.1 输入参数

sql

复制

下载

CREATE FUNCTION calculate_bonus(salary DECIMAL, performance_rating INT)

RETURNS DECIMAL

AS $$

BEGIN

RETURN salary * 0.1 * performance_rating;

END;

$$ LANGUAGE plpgsql;

3.2 输出参数

sql

复制

下载

CREATE FUNCTION get_employee_stats(

emp_id INT,

OUT total_projects INT,

OUT avg_project_score DECIMAL

)

AS $$

BEGIN

SELECT COUNT(*), AVG(score)

INTO total_projects, avg_project_score

FROM projects

WHERE employee_id = emp_id;

END;

$$ LANGUAGE plpgsql;

4. 函数特性

4.1 确定性函数

sql

复制

下载

CREATE FUNCTION get_tax_rate()

RETURNS DECIMAL

IMMUTABLE -- 表示函数结果不会改变

AS $$

BEGIN

RETURN 0.15; -- 固定税率

END;

$$ LANGUAGE plpgsql;

4.2 安全性定义

sql

复制

下载

CREATE FUNCTION update_salary(emp_id INT, new_salary DECIMAL)

RETURNS VOID

SECURITY DEFINER -- 以函数所有者权限执行

AS $$

BEGIN

UPDATE employees SET salary = new_salary WHERE id = emp_id;

END;

$$ LANGUAGE plpgsql;

5. 控制结构

5.1 条件语句

sql

复制

下载

CREATE FUNCTION get_employee_level(salary DECIMAL)

RETURNS VARCHAR

AS $$

BEGIN

IF salary > 100000 THEN

RETURN 'Senior';

ELSIF salary > 50000 THEN

RETURN 'Mid';

ELSE

RETURN 'Junior';

END IF;

END;

$$ LANGUAGE plpgsql;

5.2 循环语句

sql

复制

下载

CREATE FUNCTION factorial(n INT)

RETURNS INT

AS $$

DECLARE

result INT := 1;

i INT;

BEGIN

FOR i IN 1..n LOOP

result := result * i;

END LOOP;

RETURN result;

END;

$$ LANGUAGE plpgsql;

6. 异常处理

sql

复制

下载

CREATE FUNCTION safe_divide(a DECIMAL, b DECIMAL)

RETURNS DECIMAL

AS $$

BEGIN

BEGIN

RETURN a / b;

EXCEPTION WHEN division_by_zero THEN

RETURN NULL;

END;

END;

$$ LANGUAGE plpgsql;

7. 不同数据库的语法差异

7.1 MySQL

sql

复制

下载

DELIMITER //

CREATE FUNCTION calculate_age(birth_date DATE)

RETURNS INT

DETERMINISTIC

BEGIN

RETURN YEAR(CURDATE()) - YEAR(birth_date);

END//

DELIMITER ;

7.2 SQL Server

sql

复制

下载

CREATE FUNCTION dbo.FormatPhoneNumber(@phone VARCHAR(20))

RETURNS VARCHAR(20)

AS

BEGIN

RETURN '(' + SUBSTRING(@phone, 1, 3) + ') '

+ SUBSTRING(@phone, 4, 3) + '-'

+ SUBSTRING(@phone, 7, 4);

END;

7.3 Oracle

sql

复制

下载

CREATE OR REPLACE FUNCTION get_employee_count

RETURN NUMBER

IS

v_count NUMBER;

BEGIN

SELECT COUNT(*) INTO v_count FROM employees;

RETURN v_count;

END;

/

8. 最佳实践

命名规范:使用动词开头,如 calculate_, get_, validate_

参数验证:在函数开始时验证输入参数

错误处理:包含适当的异常处理

注释:说明函数目的、参数和返回值

性能:避免在函数中使用复杂查询或循环

9. 函数管理

9.1 修改函数

sql

复制

下载

CREATE OR REPLACE FUNCTION function_name(...)

-- 其余部分与创建相同

9.2 删除函数

sql

复制

下载

DROP FUNCTION [IF EXISTS] function_name;

9.3 查看函数定义

sql

复制

下载

-- PostgreSQL

\df function_name

-- MySQL

SHOW CREATE FUNCTION function_name;

-- SQL Server

SELECT OBJECT_DEFINITION(OBJECT_ID('schema.function_name'));

10. 实际应用示例

10.1 数据验证函数

sql

复制

下载

CREATE FUNCTION is_valid_email(email VARCHAR)

RETURNS BOOLEAN

AS $$

BEGIN

RETURN email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$';

END;

$$ LANGUAGE plpgsql;

10.2 复杂计算函数

sql

复制

下载

CREATE FUNCTION calculate_compound_interest(

principal DECIMAL,

rate DECIMAL,

years INT,

compounding_per_year INT

)

RETURNS DECIMAL

AS $$

BEGIN

RETURN principal * POWER(1 + rate/compounding_per_year,

compounding_per_year * years);

END;

$$ LANGUAGE plpgsql;

10.3 递归函数

sql

复制

下载

CREATE FUNCTION fibonacci(n INT)

RETURNS INT

AS $$

BEGIN

IF n <= 1 THEN

RETURN n;

ELSE

RETURN fibonacci(n-1) + fibonacci(n-2);

END IF;

END;

$$ LANGUAGE plpgsql;

通过掌握这些SQL函数创建技术,您可以大大提高数据库操作的效率和代码的可维护性。

Copyright © 2088 02年世界杯中国队_1930年乌拉圭世界杯 - n360l.com All Rights Reserved.
友情链接