如何在 PostgreSQL 中创建类型方法?
让我们以以下类型为例:
create type Employee as (
name varchar(20),
salary integer)
我该怎么做?
create method giveraise (percent integer) for Employee
begin
set self.salary = self.salary + (self.salary * percent) / 100;
end
Postgres 本身没有类型方法。但是,它支持使用单个参数执行函数的属性表示法。这看起来几乎与该类型的方法完全相同。考虑这个简单的例子:
CREATE OR REPLACE FUNCTION raise10(numeric)
RETURNS numeric LANGUAGE sql AS 'SELECT $1 * 1.1';
致电:
SELECT (100).raise10;
结果:
raise10
---------
110.0
一个主要限制是这仅适用于单个参数。无法传递额外的参数,例如变量 raise 的
percentage
。
也适用于复合类型。有关“计算字段”的更多信息:
要更进一步,甚至可以在该行上调用
UPDATE
并保留更改:
CREATE TABLE employee (
name text PRIMARY KEY
, salary numeric
);
INSERT INTO employee VALUES
('foo', 100)
, ('bar', 200)
;
CREATE OR REPLACE FUNCTION giveraise10(employee)
RETURNS numeric
LANGUAGE sql AS
$func$
UPDATE employee
SET salary = salary * 1.1 -- constant raise of 10%
WHERE name = ($1).name
RETURNING salary;
$func$;
致电:
SELECT *, e.giveraise10 FROM employee e;
结果:
name | salary | giveraise10
------+--------+-------------
foo | 100 | 110.0
bar | 200 | 220.0
SELECT
显示 salary
的更新前值,但该字段实际上已更新!
SELECT * FROM employee e;
name | salary
------+--------
foo | 110.0
bar | 220.0
使用这种诡计是否明智由你决定。我可能不会去那里。有更有效和透明的方法来更新表。