<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/ref/create_type.sgml,v 1.10 2001/08/16 09:01:57 yatabe Exp $
Postgres documentation
-->

<refentry id="SQL-CREATETYPE">
 <refmeta>
  <refentrytitle id="sql-createtype-title">
   CREATE TYPE
  </refentrytitle>
  <refmiscinfo>SQL<!-- Language Statements -->言語</refmiscinfo>
 </refmeta>
 <refnamediv>
  <refname>
   CREATE TYPE
  </refname>
  <refpurpose>
   <!-- Defines a new base data type -->
   新しい基本データ型を定義します。<indexterm><primary>CREATE TYPE</primary></indexterm><indexterm><primary>SQL</primary><secondary>CREATE TYPE</secondary></indexterm><indexterm><primary sortas="でーたがた">データ型</primary><secondary sortas="さくせい">作成</secondary></indexterm>
  </refpurpose>
 </refnamediv>
 <refsynopsisdiv>
  <refsynopsisdivinfo>
   <date>1999-07-20</date>
  </refsynopsisdivinfo>
<synopsis>
CREATE TYPE <replaceable class="parameter">typename</replaceable> ( INPUT = <replaceable class="parameter">input_function</replaceable>, OUTPUT = <replaceable class="parameter">output_function</replaceable>
      , INTERNALLENGTH = { <replaceable
      class="parameter">internallength</replaceable> | VARIABLE }
    [ , EXTERNALLENGTH = { <replaceable class="parameter">externallength</replaceable> | VARIABLE } ]
    [ , DEFAULT = "<replaceable class="parameter">default</replaceable>" ]
    [ , ELEMENT = <replaceable class="parameter">element</replaceable> ] [ , DELIMITER = <replaceable class="parameter">delimiter</replaceable> ]
    [ , SEND = <replaceable class="parameter">send_function</replaceable> ] [ , RECEIVE = <replaceable class="parameter">receive_function</replaceable> ]
    [ , PASSEDBYVALUE ]
    [ , ALIGNMENT = <replaceable class="parameter">alignment</replaceable> ]
    [ , STORAGE = <replaceable class="parameter">storage</replaceable> ]
)
</synopsis>
  
  <refsect2 id="R2-SQL-CREATETYPE-1">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
    <!-- Inputs -->入力
   </title>

    <variablelist>
     <varlistentry>
      <term><replaceable class="parameter">typename</replaceable></term>
      <listitem>
       <para>
	<!-- The name of a type to be created. -->
        作成する型の名前です。
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">internallength</replaceable></term>
      <listitem>
       <para>
	<!-- A literal value, which specifies the internal length of
	the new type. -->

        新しい型の内部長を指定するリテラル値です。 

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">externallength</replaceable></term>
      <listitem>
       <para>
        <!-- 
	A literal value, which specifies the external (displayed) length of
	the new type. -->

        新しい型の外部長を指定するリテラル値です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">input_function</replaceable></term>
      <listitem>
       <para>
	<!-- The name of a function, created by
	<command>CREATE FUNCTION</command>, which
	converts data from its external form to the type's
	internal form. -->

        <command>CREATE FUNCTION</command>によって作成された、外部形式のデータをその型の内部形式のデータに変換する関数の名前です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">output_function</replaceable></term>
      <listitem>
       <para>
	<!-- The name of a function, created by
	<command>CREATE FUNCTION</command>, which
	converts data from its internal form to a form suitable
	for display. -->

        <command>CREATE FUNCTION</command>によって作成された、内部形式によるデータを表示に適した形式のデータに変換する関数の名前です。 

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">element</replaceable></term>
      <listitem>
       <para>
	<!-- The type being created is an array; this specifies
	the type of the array elements. -->

        作成されるのは配列型で、その配列の要素の型を指定します。 

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">delimiter</replaceable></term>
      <listitem>
       <para>
	<!-- The delimiter character for the array elements. -->
        その配列要素の区切り文字です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">default</replaceable></term>
      <listitem>
       <para>
        <!-- 
	The default value for the data type.  Usually this is omitted,
	so that the default is NULL. -->

        データ型のデフォルト値です。通常はこれは省略されるのでデフォルトはNULLになります。

       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">send_function</replaceable></term>
      <listitem>
       <para>
        <!-- 
	The name of a function, created by <command>CREATE FUNCTION</command>, 
        which converts data of this type into a form suitable for
	transmission to another machine. -->

        <command>CREATE FUNCTION</command>によって作成された、この型のデータを他のマシンに転送できるような形式に変換する関数の名前です。

       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="parameter">receive_function</replaceable></term>
      <listitem>
       <para>
        <!-- 
	The name of a function, created by <command>CREATE FUNCTION</command>, 
        which converts data of this type from a form suitable for
	transmission from another machine to internal form. -->

        <command>CREATE FUNCTION</command>によって作成された、この型のデータを他のマシンから内部形式に転送できるような形式に変換する関数の名前です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">alignment</replaceable></term>
      <listitem>
       <para>
        <!-- 
        Storage alignment requirement of the data type.  If specified, must
	be '<literal>int4</literal>' or '<literal>double</literal>';
	the default is '<literal>int4</literal>'. -->

        データ型の格納バウンダリの条件です。このオプションが指定された場合、値は'<literal>int4</literal>'または'<literal>double</literal>'である必要があります。デフォルトは'<literal>int4</literal>'です。

       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term><replaceable class="parameter">storage</replaceable></term>
      <listitem>
       <para>
        <!--    
        Storage technique for the data type.  If specified, must
	be '<literal>plain</literal>', '<literal>external</literal>',
	'<literal>extended</literal>', or '<literal>main</literal>';
	the default is '<literal>plain</literal>'. -->

       データ型の格納手法です。指定する場合は、'<literal>plain</literal>'、'<literal>external</literal>'、'<literal>extended</literal>'、'<literal>main</literal>'のいずれかでなければなりません。デフォルトは'<literal>plain</literal>'です。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>

  <refsect2 id="R2-SQL-CREATETYPE-2">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
    <!-- Outputs -->出力
   </title>

    <variablelist>
     <varlistentry>
      <term><computeroutput>
CREATE
       </computeroutput></term>
      <listitem>
       <para>
	<!-- Message returned if the type is successfully created. -->
        型の作成に成功した場合に返されるメッセージです。

       </para>
      </listitem>
     </varlistentry>
    </variablelist>
  </refsect2>
 </refsynopsisdiv>

 <refsect1 id="R1-SQL-CREATETYPE-1">
  <refsect1info>
   <date>1998-09-21</date>
  </refsect1info>
  <title>
   <!-- Description -->説明
  </title>

  <para>
   <!-- 
   <command>CREATE TYPE</command>  allows  the user to register a 
   new user data type with Postgres for use in the current data base.   
   The user  who  defines  a type becomes its owner.
   <replaceable class="parameter">typename</replaceable> is
   the name of the new type and must  be  unique  within  the
   types defined for this database. -->
   
   <command>CREATE TYPE</command>を使うことによって、ユーザーはPostgresの現在のデータベースで使用できる、新しいユーザー定義データ型を登録できます。型を定義したユーザーはその所有者となります。<replaceable class="parameter">typename</replaceable>は新しい型の名前で、そのデータベースに定義された型名の中で一意でなければなりません。 

  </para>

  <para>
   <!-- 
   <command>CREATE TYPE</command>  requires  the  registration of 
   two functions (using create function) before defining the type.   
   The representation  of  a  new  base  type  is  determined  by
   <replaceable class="parameter">input_function</replaceable>, which
   converts the type's external  representation  to  an  internal
   representation  usable by the
   operators and functions defined for the type.   Naturally,
   <replaceable class="parameter">output_function</replaceable>
   performs the reverse transformation.  Both
   the input and output functions must be  declared  to  take
   one or two arguments of type "<literal>opaque</literal>". -->

   <command>CREATE TYPE</command>では、型を定義する前に、（CREATE FUNCTIONを用いて）2つの関数を登録しておく必要があります。新しい基本型の表現形式は、型の外部表現形式をその型用に定義された演算子と関数が使用可能な内部表現形式に変換する、<replaceable class="parameter">input_function</replaceable>で決定されます。当然、<replaceable class="parameter">output_function</replaceable>はこの逆の変換をします。入力と出力の関数は共に「<literal>opaque</literal>」型の引数を1つか2つ取るように宣言されなければなりません。

  </para>

  <para>
   <!-- 
   New  base  data  types  can be fixed length, in which case
   <replaceable class="parameter">internallength</replaceable> is a
   positive integer, or variable  length,
   in  which  case Postgres assumes that the new type has the
   same format
   as the Postgres-supplied  data  type, "<literal>text</literal>".
   To  indicate that a type is variable length, set
   <replaceable class="parameter">internallength</replaceable>
   to <option>VARIABLE</option>.
   The external representation is  similarly specified using the
   <replaceable class="parameter">externallength</replaceable>
   keyword. -->

   新しい基本型を、<replaceable class="parameter">internallength</replaceable>が正の整数となる固定長として作成することも、Postgresがその型をPostgresの組み込みデータ型「<literal>text</literal>」と同じ形式をとるものと仮定する可変長として作成することもできます。型が可変長であることを示すには、<replaceable class="parameter">internallength</replaceable>を<option>VARIABLE</option>に設定します。外部表現形式も同様にして、<replaceable class="parameter">externallength</replaceable>をキーワードを使用して指定されます。

  </para>

  <para>
   <!-- 
   To indicate that a type is an array and to indicate that a
   type has array elements, indicate the type  of  the  array
   element using the element keyword.  For example, to define
   an array of 4-byte integers ("int4"), specify
<programlisting>ELEMENT = int4</programlisting> -->

   型が配列であり、型が配列要素を持っていることを示すには、ELEMENTキーワードを使用して配列要素の型を指定します。たとえば、4バイト整数（int4）の配列を定義するには以下のように指定します。
</para>

<programlisting>ELEMENT = int4</programlisting>


  <para>
   <!-- 
   To indicate the delimiter to be used  on  arrays  of  this
   type,  <replaceable class="parameter">delimiter</replaceable>
   can be
   set to a specific character.  The default delimiter is the comma
   ("<literal>,</literal>"). -->

   その型の配列で使用する区切り文字を示すために、<replaceable class="parameter">delimiter</replaceable>には特定の文字を設定することができます。デフォルトの区切り文字はカンマ（「<literal>,</literal>」）です。
  </para>

  <para>
   <!-- 
   A default value is optionally available  in  case  a  user
   wants  some  specific  bit  pattern to mean "data not present."
   Specify the default with the <literal>DEFAULT</literal> keyword.
   <comment>How does the user specify that bit pattern and associate
    it with the fact that the data is not present?</comment> -->

   ユーザーが「データが存在しない」ことを意味する特定のビットパターンを望む場合では、デフォルト値をオプションで指定することができます。<literal>DEFAULT</literal>キーワードを使用して、デフォルトを指定します。<comment>ユーザーはどうやってそのビットパターンを指定しデータが存在しないという事実と関連させるのでしょうか。</comment>

  </para>

  <para>
   <!-- The optional arguments
   <replaceable class="parameter">send_function</replaceable> and
   <replaceable class="parameter">receive_function</replaceable>
   are  used when the application program requesting Postgres
   services resides on a different machine.   In  this  case,
   the  machine  on  which  Postgres runs may use a format for the data
   type different from that used on the remote  machine.
   In  this case it is appropriate to convert data items to a
   standard form when sending from the server to  the  client
   and  converting  from  the  standard format to the machine
   specific format when the server receives the data from the
   client.   If these functions are not specified, then it is
   assumed that the internal format of the type is acceptable
   on  all relevant machine architectures.  For example, single
   characters do not have to be converted if passed  from
   a Sun-4 to a DECstation, but many other types do. -->

   オプションの引数<replaceable class="parameter">send_function</replaceable>と<replaceable class="parameter">receive_function</replaceable>は、Postgresサービスに要求を送るアプリケーションプログラムが異なるマシンにある場合に使用します。この場合、Postgresが動いているマシンでは、遠隔マシンで使用されているデータ型と形式が異なる形式を使用する可能性があります。この場合の適切な処置は、サーバーからクライアントに送るときはデータ項目を標準形式に変換し、クライアントからサーバーがデータを受け取るときは、標準形式からマシン固有の形式に変換することです。これらの関数が指定されていない場合、関連するすべてのマシンのアーキテクチャがその型の内部形式を認識できると仮定されます。たとえば、Sun-4からDECstationに1文字を転送する場合では、変換の必要はありませんが、他の多くの型では変換が必要です。

  </para>

  <para>
   <!-- 
   The  optional flag,  <option>PASSEDBYVALUE</option>, indicates that operators
   and functions which use this data type should be passed an
   argument  by  value  rather  than by reference.  Note that you
   may not pass by value types whose internal representation is 
   more than four bytes. -->

   オプションのフラグ<option>PASSEDBYVALUE</option>は、このデータ型を使用する演算子や関数が、引数を参照によってではなく、値として渡さなければならないことを示します。内部表現形式が4バイト以上の型を値で渡すことができないことに注意してください。

  </para>

  <para>
   <!-- 
   The <replaceable class="parameter">storage</replaceable> keyword
   allows selection of storage strategies for variable-length data types
   (only <literal>plain</literal> is allowed for fixed-length types).
   <literal>plain</literal> disables TOAST for the data type: it will always
   be stored in-line and not compressed.
   <literal>extended</literal> gives full TOAST capability: the system will
   first try to compress a long data value, and will move the value out of
   the main table row if it's still too long.
   <literal>external</literal> allows the value to be moved out of the main
   table, but the system will not try to compress it.
   <literal>main</literal> allows compression, but discourages moving the
   value out of the main table.  (Data items with this storage method may
   still be moved out of the main table if there is no other way to make
   a row fit, but they will be kept in the main table preferentially over
   <literal>extended</literal> and <literal>external</literal> items.)
   -->

   キーワード<replaceable class="parameter">storage</replaceable>を使用することで、可変長データ型を格納する際の戦略を選択することができます（固定長の型には<literal>plain</literal>のみが許されています）。<literal>plain</literal>はデータ型に対してTOASTを使えなくします。データは常に一列で格納され、圧縮されません。<literal>extended</literal>はTOASTのすべての機能を有効にします。システムはまず長いデータ値を圧縮しようとし、それでもまだ長過ぎる場合は値をメインテーブルの行から削除します。<literal>external</literal>はメインテーブルから値を削除することを許しますが、システムはデータを圧縮しようとしません。<literal>main</literal>はデータの圧縮を許しますが、値をメインテーブルから削除することを止めます（この格納メソッドを持つデータアイテムは、ほかに行を適合させる方法がない場合にはメインテーブルから削除されてしまうかもしれませんが、<literal>extended</literal>や<literal>external</literal>が指定されているアイテムよりも優先してメインテーブルに残されます）。

  </para>

  <para>
   <!-- 
   For new base types, a user can define operators, functions
   and aggregates using the appropriate facilities  described
   in this section. -->

   新しい基本型に対して、この節で記述した適切な手法で演算子、関数、集約を定義することができます。 

  </para>

  <refsect2>
   <title><!-- Array Types -->配列型</title>
   <para>
<indexterm><primary sortas="でーたがた">データ型</primary><secondary sortas="はいれつ">配列</secondary></indexterm>
    <!-- 
    Two   generalized   built-in   functions,   array_in   and
    array_out, exist for  quick  creation  of  variable-length
    array  types.   These  functions  operate on arrays of any
    existing Postgres type. -->

    可変長の配列型を高速に作成するために、array_inとarray_outという2つの汎用組み込み関数が存在します。この2つの関数は、いかなる既存のPostgresの型の配列をも処理します。

   </para>
  </refsect2>

 </refsect1>

 <refsect1>
  <title><!-- Examples -->例</title>
  <para>
   <!-- This command creates the box data type and then uses the
   type in a table definition: -->

   以下のコマンドは、boxデータ型を作成し、その型をテーブル定義の中で使用します。</para>


<programlisting>
CREATE TYPE box (INTERNALLENGTH = 8,
    INPUT = my_procedure_1, OUTPUT = my_procedure_2);
CREATE TABLE myboxes (id INT4, description box);
</programlisting>

  <para>
   <!-- This command creates a variable length array type with
   integer elements: -->

   以下のコマンドは、整数を要素として持つ可変長配列型を作成します。
</para>

<programlisting>
CREATE TYPE int4array (INPUT = array_in, OUTPUT = array_out,
    INTERNALLENGTH = VARIABLE, ELEMENT = int4);
CREATE TABLE myarrays (id int4, numbers int4array);
</programlisting>

  <para>
   <!-- 
   This command creates a large object type and uses it in
   a table definition: -->

   以下のコマンドは、ラージオブジェクト型を作成し、その型をテーブル定義の中で使用します。
</para>

<programlisting>
CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout,
    INTERNALLENGTH = VARIABLE);
CREATE TABLE big_objs (id int4, obj bigobj);
</programlisting>

  <refsect2 id="R2-SQL-CREATETYPE-3">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
    <!-- Notes -->注釈
   </title>

   <para>
    <!-- 
    Type  names  cannot  begin  with  the underscore character
    ("_") and can only be 31 characters long.  This is because
    Postgres silently creates an array type for each base type
    with a name consisting of the base type's  name  prepended
    with an underscore. -->

    型名はアンダースコア（「_」）で始まってはいけません。また長さは31文字までに制限されています。これはPostgresが内部で、ある基本型の配列型を作成する際に、基本型名の前にアンダースコアを付けた名前で作成するためです。

   </para>

   <para>
    <!-- 
    Refer to <command>DROP TYPE</command> to remove an existing type.
    -->

    既存の型の削除に関しては<command>DROP TYPE</command>を参照してください。
 
   </para>
   <para>
    <!-- See also <command>CREATE  FUNCTION</command>,
    <command>CREATE  OPERATOR</command> and the chapter on Large Objects
    in the <citetitle>PostgreSQL Programmer's Guide</citetitle>.
    -->

    <command>CREATE  FUNCTION</command>、<command>CREATE  OPERATOR</command>と、<citetitle>&programmer-guide;</citetitle>のラージオブジェクトに関する章も参照してください。

   </para>
  </refsect2>
 </refsect1>
 
 
 <refsect1 id="R1-SQL-CREATETYPE-3">
  <title>
   <!-- Compatibility -->互換性
  </title>

  <refsect2 id="R2-SQL-CREATETYPE-4">
   <refsect2info>
    <date>1998-09-21</date>
   </refsect2info>
   <title>
    SQL3
   </title>
   <para>
   <!-- 
   <command>CREATE TYPE</command> is an <acronym>SQL3</acronym> statement.
   -->

   <command>CREATE TYPE</command>は<acronym>SQL3</acronym>文です。

   </para>
  </refsect2>
 </refsect1>
</refentry>


<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"../reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:"/usr/lib/sgml/catalog"
sgml-local-ecat-files:nil
End:
-->
