PostgreSQL 类型方法

问题描述 投票:0回答: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
postgresql
1个回答
3
投票

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

db-fiddle
sqlfiddle

SELECT
显示
salary
的更新前值,但该字段实际上已更新!

SELECT * FROM employee e;
 name | salary 
------+--------
 foo  |  110.0 
 bar  |  220.0 

使用这种诡计是否明智由你决定。我可能不会去那里。有更有效和透明的方法来更新表。

© www.soinside.com 2019 - 2024. All rights reserved.