2017-06-30 16 views
0

私はPostgreSQL 9.6を使用しています。 PostgreSQLに文字列と数値を含む新しい通貨型拡張を作成したいと思います。内部型を使用してPostgreSQLのカスタム構造体データ型を書き込む方法

ドキュメントhttps://www.postgresql.org/docs/9.6/static/sql-createtype.htmlによると、私はPostgreSQLで直接作成することができますが、これは文字列を使用して型を表現してキャストしたいので、私が望むものではありません。だから解決策は、 "ボックス"タイプのようなカスタムタイプを作成することです。ドキュメントには次の情報が表示されます。

CREATE TYPE box; 

CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ; 
CREATE FUNCTION my_box_out_function(box) RETURNS cstring AS ... ; 

CREATE TYPE box (
    INTERNALLENGTH = 16, 
    INPUT = my_box_in_function, 
    OUTPUT = my_box_out_function 
); 

しかし、このような関数を書くには、実際には役に立ちません。さらに検索すると、関数はC言語でしか記述できず、単純型の例であり、構造体型ではありません。

だから私は基本的に、私は私のvarlenaヘッダを実装する手間を省くことになる固定式の数値を、使用したい

typedef struct { 
    char code[4]; 
    Numeric numeric; 
} Currency 

ような何かをしたいです。通常、通貨には小数点が固定されています。また、数値型の関数を再利用できるので、数値型を内部的に使用できるようにしたいと考えています。

私の構造体を定義するために、PostgreSQLと同様の構文(Numeric(10,2)など)を使用できるように、Numericを使用するにはどうすればよいですか? currency_in関数の中でnumeric_in関数を使用できますか?

+1

私は実際にCompositeタイプを作成したいと思いますが、Baseタイプではありません。 – Kevin

+0

あなたがこのようにしたいことをすることは、大変な作業です。演算子、インデックスへのアクセスのための演算子クラス、さらに多くを定義する必要があります。あなたはかなりのポストグルの内臓をしっかりと理解しておく必要があります。 Cのユーザ定義データ型は、包括的に実装するのは簡単ではありません。ドメインまたは複合型を考えてみましょう。 –

+0

VARLENAヘッダーが最初に来なければならないので、実際には、それをどのように記述すればうまくいきません。 –

答えて

0

characternumericの両方がvarlenaであるため、それらを固定長のデータ構造に格納することはできません。

文字の格納
typedef struct { 
    /* value times 100 */ 
    int64 value; 
    /* currency name */ 
    char denomination[4]; 
} currency; 

が最後の位置合わせの問題を回避できるように私は、データ型を定義します。

値に対する演算は、単純な整数演算になりました。 2つの値を掛け合わせたり、2つの値を捨てたいとは思いません。それはあまり意味がないでしょう。

+0

興味深い解決策、はい私はコードを見て、それはお金の種類が同様の実装を共有する(値を格納する整数を使用する)ようです。 – Sylvain

+0

アライメントの問題について少し詳しく説明できますか?私はこれについて聞いたことがあるが、私はあまりそれに精通していない。 – Sylvain

+1

[このWikipediaの記事](https://en.wikipedia.org/wiki/Data_structure_alignment#Data_structure_padding)を参照してください。私は私が言ったことにうんざりしていた。無駄なスペースの問題です。 'char'フィールドの長さが4バイトの場合、いくつかのプラットフォームではパディングのために4バイトが無駄になることがあります。 –

関連する問題