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に、行でを呼び出して変更を永続化することもできます。

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
は、 のSELECTpre-UPDATE値を表示しますsalaryが、フィールドは実際に更新されています。

SELECT *, e.giveraise10 FROM employee e;

 name | salary 
------+--------
 foo  |  110.0 
 bar  |  220.0 

そのようなトリックを使うのが賢明かどうかはあなたが決めることです。テーブルを更新するためのより効率的で透過的な方法があります。

于 2013-02-12T10:22:02.373 に答える