2017-02-28 12 views
1

私はPostgreSQL(現在はMSSQLで動作しています)の新機能です。複数の関数が複合型を使用しているときに複合型を変更するにはどうすればよいですか?

create or replace function public.getCustomers(value text) 
returns setof Customer as 
$$ 

    select "uid", "name", from "Common_Customer"; 

$$ 
language sql; 

すべてが動作し、痛みはありませんが、突然、あなたは顧客にもlastnameプロパティを必要としていることを把握:我々は複合型Customer(uid uuid, name text)を持っていて、のようなあなたの関数(手順)がこの型を返すように選択すると仮定しますデータベースから返されます。

したがって、顧客のタイプを変更して、属性lastnameを追加すると、問題が始まる場所になります。 Customerタイプには属性を簡単に追加できるとわかりましたが、新しく追加された属性lastnameが存在しないため、すべての機能が中断され、複合タイプ属性のデフォルトはありません。

あなたはこのような状況で何をしていますか?まず、その型を使ってすべての関数を見つけ出し、それらを置き換えるクエリを書いてから型を変更し、1回のコミットですべての関数を置き換えますか?

MSSQLには型がありません(プロシージャが返す必要のある型を指定する必要はありません)。ストアドプロシージャは、必要なものを正確に返すことができます(これは時々問題です)。だから私はここで少し空白です。

答えて

1

PostgreSQLは厳密に型指定された環境です。何かを返すことができるMSSQLプロシージャとは大きな違いがあります。部分的にはカーソルで解決できます。カーソルを返す関数を書くことができます。カーソルは動的です。

CREATE OR REPLACE FUNCTION fx() 
RETURNS REFCURSOR AS $$ 
DECLARE refc refcursor; 
BEGIN 
    OPEN refc FOR SELECT ...; 
    RETURN refc; 
END; 
$$ LANGUAGE plpgsql; 

ただし、この手法は、MSSQL 1:1からの移行を行う場合にのみ使用してください。

PostgreSQLのベストプラクティス(Oracleは似ています)は、簡単なクエリを手続き/関数で囲まないでください。 代わりにビューを使用。クエリの最適化のためのスペースを壊すことはなく、問題を解決する必要はありません。

SQLの単位は、ビューであり、関数ではありません。

データの変更、データのチェックには機能が必要ですが、ビューを置き換えるべきではありません。計算が複雑すぎると、SET RETURNING FUNCTIONSが大きくなることがあります。しかし、単純なクエリをラップするのはベストプラクティスではありません。

0

通常、私はSETOF my_composite_typeの代わりにRETURNS TABLE(...)を好んでいます。戻り値の型を共通型または既存の表にバインドする必要があるのはSETOFです。例:はい、私はそれらのすべてで複合型および更新に応じて、すべての機能(およびおそらく他のオブジェクト)を見つけるだろう、あなたが立つ場所があると、言っ

単一の取引。

How to check which function uses a type?

またはリストによってオブジェクト(pgAdminでのように)いくつかのクライアント

関連する問題