1

如何在 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
4

1 回答 1

2

您在评论中被告知,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 

使用这种诡计是否明智由您决定。有更有效和更透明的方式来更新表。

于 2013-02-12T10:22:02.373 回答