如何在 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
如何在 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 没有类型方法。
但是,Postgres 支持使用单个参数执行函数的属性表示法。这看起来几乎完全像类型的方法。考虑这个简单的例子:
CREATE OR REPLACE FUNCTION raise10(numeric)
RETURNS numeric LANGUAGE sql AS 'SELECT $1 * 1.1';
称呼:
SELECT (100).raise10;
结果:
raise10
---------
110.0
一个主要限制是这只适用于单个参数。没有办法传递额外的参数,比如percentage
变量 raise。
也适用于复合类型。有关此相关答案中“计算字段”的更多信息:
将常见查询存储为列?
为了更进一步,甚至可以UPDATE
在行上调用 an 并保持更改:
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 AS
$func$
UPDATE employee
SET salary = salary * 1.1 -- constant raise of 10%
WHERE name = ($1).name
RETURNING salary;
$func$ LANGUAGE sql;
称呼:
SELECT *, e.giveraise10 FROM employee e;
结果:
name | salary | giveraise10
------+--------+-------------
foo | 100 | 110.0
bar | 200 | 220.0
->sqlfiddle
显示SELECT
的 pre-UPDATE 值salary
,但该字段实际上已更新!
SELECT *, e.giveraise10 FROM employee e;
name | salary
------+--------
foo | 110.0
bar | 220.0
使用这种诡计是否明智由您决定。有更有效和更透明的方式来更新表。