在 PostgreSQL(PG)中,Language(语言)是指用于编写存储过程、函数和触发器的编程语言。PostgreSQL 支持多种编程语言,这些语言可以用来创建存储在数据库中的函数,并在查询或触发器中调用。
内置和可扩展的编程语言
PostgreSQL 内置支持一种语言,即 SQL,本质上是查询语言。除此之外,还支持多种可扩展语言(PL,即 Procedural Language,过程化语言)。常见的语言包括:
- SQL:用于编写 SQL 查询逻辑,主要用于简单的操作和查询。
- PL/pgSQL:PostgreSQL 内置的过程化语言,类似于 Oracle 的 PL/SQL,支持变量、控制结构(如条件语句、循环)、异常处理等。适合编写复杂的逻辑和业务处理。
- PL/Python:允许用 Python 编写存储过程和函数,适合那些熟悉 Python 的开发者。
- PL/Perl:使用 Perl 编写存储过程。
- PL/Tcl:使用 Tcl 语言编写存储过程。
此外,PostgreSQL 支持外部语言扩展,可以安装第三方的语言扩展模块来支持更多的编程语言。
常见语言的特点和使用场景
-
SQL
- 用途:用于编写简单的查询和数据操作逻辑,适合不需要复杂逻辑的函数。
- 示例:
CREATE FUNCTION add_two_numbers(a INT, b INT) RETURNS INT AS $$ SELECT a + b; $$ LANGUAGE SQL;
-
PL/pgSQL
- 用途:PostgreSQL 默认的过程化语言,适合编写复杂的业务逻辑,支持循环、条件语句和异常处理。
- 示例:
CREATE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC) RETURNS NUMERIC AS $$ DECLARE final_price NUMERIC; BEGIN final_price := price - (price * discount); RETURN final_price; END; $$ LANGUAGE plpgsql;
-
PL/Python
- 用途:使用 Python 编写函数,适合那些需要 Python 的丰富库和灵活性的场景。
- 示例:
CREATE FUNCTION py_add_two_numbers(a INT, b INT) RETURNS INT AS $$ return a + b $$ LANGUAGE plpythonu;
-
PL/Perl
- 用途:适合使用 Perl 语言的场景,适合需要文本处理的任务。
- 示例:
CREATE FUNCTION perl_hello() RETURNS TEXT AS $$ return "Hello from Perl!"; $$ LANGUAGE plperl;
-
PL/Tcl
- 用途:使用 Tcl 编写函数,适合那些熟悉 Tcl 的开发者。
- 示例:
CREATE FUNCTION tcl_hello() RETURNS TEXT AS $$ return "Hello from Tcl!" $$ LANGUAGE pltcl;
如何管理语言
-
查看数据库中支持的语言:可以通过查询
pg_language
系统表来查看当前数据库中已安装的语言。SELECT * FROM pg_language;
-
添加新语言:通过
CREATE LANGUAGE
命令可以向数据库中添加新的语言。例如,添加plpgsql
语言:CREATE LANGUAGE plpgsql;
-
删除语言:可以通过
DROP LANGUAGE
命令来删除不再需要的语言:DROP LANGUAGE plpgsql;
注意事项
- 安全性:PostgreSQL 中的一些过程语言(如
plpythonu
和plperlu
)是“不受信任”的语言,允许访问操作系统资源,因此在使用这些语言时需要特别注意安全问题。相对而言,像plpgsql
这样的语言是“受信任”的,不允许访问外部系统资源。 - 性能:不同的语言在性能上可能有所差异,对于简单的操作,SQL 或
plpgsql
可能是最佳选择,因为它们与数据库的集成更紧密。
语言的扩展性
除了内置的语言外,PostgreSQL 允许开发者编写并安装新的编程语言扩展模块(比如用 C 编写的扩展)。这使得 PostgreSQL 具备极强的可扩展性,能够适应不同开发者和业务场景的需求。