<Chapter id="spi">
<DocInfo>
<AuthorGroup>
<Author>
<FirstName>Vadim</FirstName>
<Surname>Mikheev</Surname>
</Author>
</AuthorGroup>
<Date>Transcribed 1998-01-16</Date>
</DocInfo>

<!-- <Title>Server Programming Interface</Title> -->
<Title>サーバープログラム開発用インターフェイス</Title>
<indexterm><primary>SPI</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary>SPI</secondary></indexterm><indexterm><primary sortas="さーばーぷろぐらむかいはつよういんたーふぇいす">サーバープログラム開発用インターフェイス</primary></indexterm>
<para>
<!-- 
The <FirstTerm>Server Programming Interface</FirstTerm> 
(<Acronym>SPI</Acronym>) gives users the
ability to run <Acronym>SQL</Acronym> queries inside user-defined 
<Acronym>C</Acronym> functions.
The available Procedural Languages (<Acronym>PL</Acronym>) give an alternate
means to access these capabilities. -->

<FirstTerm>Server Programming Interface</FirstTerm>（<Acronym>SPI</Acronym>）は、ユーザー定義の<Acronym>C</Acronym>関数から<Acronym>SQL</Acronym>問い合わせを実行する機能をユーザーに提供します。使用可能な手続き言語（<Acronym>PL</Acronym>）はこの機能にアクセスする別の方法を提供しています。

</para>

<para>
<!-- 
In fact, <Acronym>SPI</Acronym> is just a set of native interface functions
to simplify access to the Parser, Planner, Optimizer and Executor. 
<Acronym>SPI</Acronym> also does some memory management. -->

実際には、<Acronym>SPI</Acronym>は、パーサー、プランナ、オプティマイザ、エクゼキュータへのアクセスを単純化にするための一連の組み込み関数群に過ぎません。また、<Acronym>SPI</Acronym>はメモリ管理も行います。

</para>

<para>
<!-- 
To avoid misunderstanding we'll use <FirstTerm>function</FirstTerm> 
to mean <Acronym>SPI</Acronym> interface functions and 
<FirstTerm>procedure</FirstTerm> for user-defined C-functions 
using <Acronym>SPI</Acronym>. -->

誤解を防ぐために、これ以降、<FirstTerm>関数</FirstTerm>を<Acronym>SPI</Acronym>インターフェイス関数の意味で、<FirstTerm>プロシージャ</FirstTerm>を<Acronym>SPI</Acronym>を呼び出すユーザー定義のC関数の意味で使うことにします。<indexterm><primary>SPI</primary><secondary sortas="いんたーふぇいすかんすう">インターフェイス関数</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="ぷろしーじゃ">プロシージャ</secondary></indexterm>
</para>

<para>
<!-- 
Procedures which use <Acronym>SPI</Acronym> are called by the
Executor.  The <Acronym>SPI</Acronym> calls recursively invoke the
Executor in turn to run queries.  When the Executor is invoked
recursively, it may itself call procedures which may make
<Acronym>SPI</Acronym> calls. -->

<Acronym>SPI</Acronym>を使うプロシージャはエクゼキュータから呼び出されます。<Acronym>SPI</Acronym>は問い合わせを実行するためにエクゼキュータを順番に再帰的に呼び出します。エクゼキュータが再帰的に呼び出されると、それ自身で<Acronym>SPI</Acronym>を呼び出すプロシージャを呼び出す場合があります。
</para>

<para>
<!-- 
Note, that if during execution of a query from a procedure the transaction
is aborted then control will not be returned to your procedure. Rather, all 
work will be rolled back and the server will wait for the next command from 
the client.  This will be changed in future versions. -->

プロシージャの中で問い合わせを実行している最中にトランザクションが中断すると、そのプロシージャに制御が戻らないということに注意してください。それどころか、すべての実行結果がロールバックされてサーバーはクライアントからの次のコマンドを待つ状態になります。この仕様は将来の版で変更される予定です。<indexterm><primary>SPI</primary><secondary sortas="とらんざくしょん">トランザクション</secondary></indexterm>
</para>

<para>
<!-- 
Other restrictions are the inability to execute BEGIN, END and ABORT
(transaction control statements) and cursor operations.  This will also be
changed in the future. -->

この他の制約として、（トランザクションの制御文である）BEGIN、END、ABORTとカーソル操作ができないという点があります。これも将来変更される予定です。
</para>

<para>
<!-- 
If successful, <Acronym>SPI</Acronym> functions return a non-negative 
result (either via a returned integer value or in SPI_result global 
variable, as described below).
On error, a negative or NULL result will be returned. -->

<Acronym>SPI</Acronym>関数は、成功すると非負の結果を（後述のように、整数値またはSPI_resultグローバル変数のどちらかを通して）返します。失敗した場合は、負またはNULLという結果を返します。

</para>

<Sect1 id="spi-interface">
<!-- <Title>Interface Functions</Title> -->
<Title>インターフェイス関数</Title>

<REFENTRY ID="SPI-SPICONNECT">
<REFMETA>
<REFENTRYTITLE>SPI_connect</REFENTRYTITLE>
<REFMISCINFO>SPI - Connection Management</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_connect
</REFNAME>
<REFPURPOSE>
   <!-- Connects your procedure to the SPI manager. -->
   ユーザー定義のプロシージャをSPIマネージャに接続します。<indexterm><primary>SPI_connect</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_connect</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_connect</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="SPIまねーじゃ">SPIマネージャ</secondary><tertiary sortas="せつぞく">接続</tertiary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPICONNECT-1"><PRIMARY>SPI</PRIMARY><SECONDARY>connecting</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPICONNECT-2"><PRIMARY>SPI_connect</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
int SPI_connect(void)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPICONNECT-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<para><!-- None -->なし
</para>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPICONNECT-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>int
</TERM>
<LISTITEM>
<para>
<!-- Return status -->状態を返します。
</para>
<VARIABLELIST>
<VARLISTENTRY>
<TERM><ReturnValue>SPI_OK_CONNECT</ReturnValue>
</TERM>
<LISTITEM>
<para>
   <!-- if connected -->接続した場合
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM><ReturnValue>SPI_ERROR_CONNECT</ReturnValue>
</TERM>
<LISTITEM>
<para>
   <!-- if not connected -->接続できなかった場合
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPICONNECT-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
<!--  
<FUNCTION>SPI_connect</FUNCTION> opens a connection to the 
<ProductName>Postgres</ProductName> backend.
You should call this function if you will need to execute queries. Some
utility SPI functions may be called from un-connected procedures. -->

<FUNCTION>SPI_connect</FUNCTION>は<ProductName>Postgres</ProductName>バックエンドとの接続を開きます。問い合わせを実行する必要がある場合は、この関数を呼び出す必要があります。SPIユーティリティ関数には接続を行わないプロシージャから呼び出すことができるものもあります。

</para>
<para>
   <!-- If your procedure is already connected,
   <Function>SPI_connect</Function> will return an
   <ReturnValue>SPI_ERROR_CONNECT</ReturnValue> error.  Note that this
   may happen if a procedure which has called
   <Function>SPI_connect</Function> directly calls another procedure
   which itself calls <Function>SPI_connect</Function>.  While
   recursive calls to the <Acronym>SPI</Acronym> manager are permitted
   when an <Acronym>SPI</Acronym> query invokes another function which
   uses <Acronym>SPI</Acronym>, directly nested calls to
   <Function>SPI_connect</Function> and
   <Function>SPI_finish</Function> are forbidden. -->

   すでにプロシージャが接続済みの場合、<Function>SPI_connect</Function>は<ReturnValue>SPI_ERROR_CONNECT</ReturnValue>というエラーを返します。これは、<Function>SPI_connect</Function>を呼び出したプロシージャが直接それ自身で<Function>SPI_connect</Function>を呼び出す別のプロシージャを呼び出す場合に起こります。<Acronym>SPI</Acronym>問い合わせが<Acronym>SPI</Acronym>を使った他の関数を呼び出すときに、<Acronym>SPI</Acronym>マネージャを再帰的に呼び出すことが許されている間は、<Function>SPI_connect</Function>と<Function>SPI_finish</Function>を直接呼び出すことは禁止されています。


</para>
</REFSECT1>
<!--<REFSECT1 ID="R1-SPI-SPICONNECT-2">
<TITLE>--><!-- Usage --><!--使用法
</TITLE>
<para>-->
<!--
XXX thomas 1997-12-24
--><!--
</para>
</REFSECT1>-->
<REFSECT1 ID="R1-SPI-SPICONNECT-3">
<TITLE><!-- Algorithm -->アルゴリズム
</TITLE>
<para><!-- <FUNCTION>SPI_connect</FUNCTION> performs the following:
       -->
      <FUNCTION>SPI_connect</FUNCTION>は以下を実行します。
 
</para>
<!--<VARIABLELIST>
<VARLISTENTRY>
<TERM>&bull;
</TERM>-->
<itemizedlist>
<LISTITEM>
<para> <!-- 
   Initializes the SPI internal
   structures for query execution and memory management. -->

   問い合わせの実行とメモリの管理を行うSPIの内部構造体を初期化します。

</para>
</LISTITEM>
<!--</VARLISTENTRY>
</VARIABLELIST>-->
</itemizedlist>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPICONNECT-4">
<TITLE>
</TITLE>

</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIFINISH">
<REFMETA>
<REFENTRYTITLE>SPI_finish</REFENTRYTITLE>
<REFMISCINFO>SPI - Connection Management</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_finish
</REFNAME>
<REFPURPOSE>
   <!-- Disconnects your procedure from the SPI manager. -->
   ユーザー定義のプロシージャをSPIマネージャから切断します。<indexterm><primary>SPI_finish</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_finish</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_finish</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="SPIまねーじゃ">SPIマネージャ</secondary><tertiary sortas="せつだん">切断</tertiary></indexterm>

</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIFINISH-1"><PRIMARY>SPI</PRIMARY><SECONDARY>disconnecting</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIFINISH-2"><PRIMARY>SPI_finish</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_finish(void)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIFINISH-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<para><!-- None -->なし
</para>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIFINISH-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>int</TERM>
<LISTITEM>
<SimpleList>
<Member><ReturnValue>SPI_OK_FINISH</ReturnValue>――正常に切断された場合。
   <!-- if properly disconnected -->
</Member>
<Member><ReturnValue>SPI_ERROR_UNCONNECTED</ReturnValue>――未接続のプロシージャから呼び出された場合。
   <!-- if called from an un-connected procedure -->
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIFINISH-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
<!-- 
<FUNCTION>SPI_finish</FUNCTION> closes an existing connection to the 
<ProductName>Postgres</ProductName> backend.
You should call this function after completing operations through the 
SPI manager. -->

<FUNCTION>SPI_finish</FUNCTION>は、既存の<ProductName>Postgres</ProductName>バックエンドへの接続を閉じます。SPIマネージャを使った操作を終了した後にはこの関数を呼び出してください。
</para>
<para> <!-- 
You may get the error return <ReturnValue>SPI_ERROR_UNCONNECTED</ReturnValue> 
if <Function>SPI_finish</Function> is called without having a current valid 
connection.
There is no fundamental problem with this; it means that nothing was done 
by the SPI manager. -->

有効な接続が存在しない状態で<Function>SPI_finish</Function>が呼び出された場合、<ReturnValue>SPI_ERROR_UNCONNECTED</ReturnValue>というエラーが返ります。このエラーコードについては特に問題はありません。これはSPIマネージャが何も行わなかったということを意味しています。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIFINISH-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para>
<!-- 
<Function>SPI_finish</Function> <Emphasis>must</Emphasis> be called as
a final step by a connected procedure or you may get unpredictable results! 
Note that you can safely skip the call to <Function>SPI_finish</Function>
if you abort the transaction (via elog(ERROR)). -->

<Function>SPI_finish</Function>は<Emphasis>必ず</Emphasis>接続したプロシージャの最後の段階で呼び出されなければいけません。さもないと、予測できない結果が起きるかもしれません。トランザクションを中断（elog(ERROR)を使って）した場合は、SPI_finishの呼び出しを省略しても問題がないことに注意してください。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIFINISH-3">
<TITLE><!-- Algorithm -->アルゴリズム
</TITLE>
<para><!-- <FUNCTION>SPI_finish</FUNCTION> performs the following: -->
<FUNCTION>SPI_finish</FUNCTION>は以下を行います。
</para>
<!--<VARIABLELIST>
<VARLISTENTRY>
<TERM>&bull;
</TERM>-->
<itemizedlist>
<LISTITEM>
<para> <!-- 
   Disconnects your procedure from the SPI manager and frees all memory
   allocations made by your procedure via <Function>palloc</Function> since
 the <Function>SPI_connect</Function>. 
   These allocations can't be used any more! See Memory management. -->

  ユーザー定義のプロシージャをSPIマネージャから切断し、<Function>SPI_connect</Function>を実行してからそのプロシージャが<Function>palloc</Function>を使用して獲得したメモリをすべて解放します。このメモリはもはや使用できません。<xref linkend="spi-memory"><!--メモリ管理の項-->を参照して下さい。

</para>
</LISTITEM>
<!--</VARLISTENTRY>
</VARIABLELIST>-->
</itemizedlist>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIFINISH-4">
<TITLE>Structure
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIEXEC">
<REFMETA>
<REFENTRYTITLE>SPI_exec</REFENTRYTITLE>
<REFMISCINFO>SPI - Connection Management</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_exec
</REFNAME>
<REFPURPOSE><!-- 
   Creates an execution plan (parser+planner+optimizer) and executes a query.
   -->

   実行計画（パーサー＋プランナ＋オプティマイザ）を生成し、問い合わせを実行します。<indexterm><primary>SPI_exec</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_exec</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_exec</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="じっこうけいかく">実行計画</secondary></indexterm>

</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIEXEC-1"><PRIMARY>SPI</PRIMARY><SECONDARY>executing</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIEXEC-2"><PRIMARY>SPI_exec</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_exec(<REPLACEABLE CLASS="PARAMETER">query</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIEXEC-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
char *<REPLACEABLE CLASS="PARAMETER">query</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- String containing query plan -->
問い合わせ計画を含む文字列

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Maximum number of tuples to return -->
返されるタプルの最大数
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIEXEC-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>int
</TERM>
<LISTITEM>
<SimpleList>
<Member>
   <ReturnValue>SPI_OK_EXEC</ReturnValue><!--  if properly disconnected -->
   ――正しく実行できた場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_UNCONNECTED</ReturnValue> 
   <!-- if called from an un-connected procedure -->
   ――未接続なプロシージャから呼び出された場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_ARGUMENT</ReturnValue> 
   <!-- 
   if query is NULL or <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> < 0.
   -->

  ――引数queryがNULLまたはtcount < 0の場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_UNCONNECTED</ReturnValue> 
   <!-- if procedure is unconnected. -->
   ――未接続なプロシージャから呼び出された場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_COPY</ReturnValue> <!-- if COPY TO/FROM stdin.-->
   ――COPY TO/FROM stdinの場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_CURSOR</ReturnValue> 
    <!-- if DECLARE/CLOSE CURSOR, FETCH. -->
    ――DECLARE/CLOSE CURSOR、FETCHの場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_TRANSACTION</ReturnValue> 
    <!-- if BEGIN/ABORT/END. -->
    ――BEGIN/ABORT/ENDの場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_OPUNKNOWN</ReturnValue> 
   <!-- if type of query is unknown (this shouldn't occur). -->
   ――未知の問い合わせタイプの場合（これは起こるべきではありません）
</Member>
</SimpleList>

<para><!-- 
   If execution of your query was successful then one of the following
   (non-negative) values will be returned: -->
 
   問い合わせの実行が成功した場合、以下の（負ではない）値のいずれかが返ります。
</para>

<SimpleList>
<Member>
   <ReturnValue>SPI_OK_UTILITY</ReturnValue>
   <!--  if some utility (e.g. CREATE TABLE ...) was executed -->
    ――ユーティリティ（たとえばCREATE TABLE ...）が実行された場合
</Member>
<Member>
   <ReturnValue>SPI_OK_SELECT</ReturnValue> 
    <!-- if SELECT (but not SELECT ... INTO!) was executed -->
    ――（SELECT ... INTO<emphasis>以外の</emphasis>）SELECTが実行された場合
</Member>
<Member>
   <ReturnValue>SPI_OK_SELINTO</ReturnValue> 
    <!-- if SELECT ... INTO was executed -->
     ――SELECT ... INTOが実行された場合
</Member>
<Member>
   <ReturnValue>SPI_OK_INSERT</ReturnValue> 
    <!--  if INSERT (or INSERT ... SELECT) was executed -->
    ――INSERT（またはINSERT ... SELECT）が実行された場合
</Member>
<Member>
   <ReturnValue>SPI_OK_DELETE</ReturnValue> <!-- if DELETE was executed -->
   ――DELETEが実行された場合
</Member>
<Member>
   <ReturnValue>SPI_OK_UPDATE</ReturnValue><!-- if UPDATE was executed -->
   ――UPDATEが実行された場合
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIEXEC-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para> <!-- 
<FUNCTION>SPI_exec</FUNCTION> creates an execution plan (parser+planner+
optimizer) and executes the query for 
<REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> tuples. -->

<FUNCTION>SPI_exec</FUNCTION>は、実行計画（パーサー＋プランナ＋オプティマイザ）を生成し、<REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE>タプルの分の問い合わせを実行します。


</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIEXEC-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para> 
<!-- 
  This should only be called from a connected procedure.
   If <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> is zero then it executes the query for all tuples returned by the
   query scan. Using <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> > 0 you may restrict the number of tuples for
   which the query will be executed. For example,  -->

接続済みのプロシージャからのみこの関数を呼び出してください。<REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE>が0ならば、問い合わせスキャンが返したすべてのタプルについて問い合わせを行います。<REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> &gt; 0とすることで、問い合わせの対象となるタプルの数を制限することができます。たとえば、以下の場合は、最大5個のタプルをテーブルに挿入することができます。
</para>

<programlisting>
SPI_exec ("insert into table select * from table", 5);
</programlisting>

<para>
<!-- will allow at most 5 tuples to be inserted into table.
If execution of your query was successful then a non-negative 
value will be returned. -->

問い合わせの実行が成功した場合、負ではない値が返ります。
</para>

<Note>
<para><!-- 
You may pass many queries in one string or query string may be
re-written by RULEs. <Function>SPI_exec</Function> returns the result for 
the last query executed. -->

1個の文字列の中に複数の問い合わせを入れて渡したり、RULEシステムによって複数の問い合わせに書き換えられる可能性のある文字列を渡しても構いません。<Function>SPI_exec</Function>は最後に実行された問い合わせの結果を返します。

</para>
</Note>

<para>
<!-- 
   The actual number of tuples for which the (last) query was executed is
   returned in the global variable SPI_processed (if not 
   <ReturnValue>SPI_OK_UTILITY</ReturnValue>).
   If <ReturnValue>SPI_OK_SELECT</ReturnValue> returned and SPI_processed 
   &gt; 0 then you may use global pointer SPITupleTable *SPI_tuptable to 
   access the selected tuples:
   Also NOTE, that <Function>SPI_finish</Function> frees and makes all 
   SPITupleTables unusable! (See Memory management). -->

   実際に（最後の）問い合わせの処理対象となったタプルの数は（<ReturnValue>SPI_OK_UTILITY</ReturnValue>でない限り）グローバル変数SPI_processedに設定されます。もし<ReturnValue>SPI_OK_SELECT</ReturnValue>が返り、SPI_processed &gt; 0ならば、グローバル変数であるSPITupleTable *SPI_tuptableというポインタを使って、選択されたタプルにアクセスできます。また、<Function>SPI_finish</Function>はすべてのSPITupleTableを解放しますので、SPITupleTableは使用できなくなることに注意してください（<xref linkend="spi-memory"><!--メモリ管理の項-->を参照してください）。

</para>

<para><!-- 
   <Function>SPI_exec</Function> may return one of the following (negative) 
   values: -->
   SPI_execは次のような（負の）値を返す可能性があります。
</para>

<SimpleList>
<Member>
   <ReturnValue>SPI_ERROR_ARGUMENT</ReturnValue>
   <!-- 
   if query is NULL or <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> < 0.
   -->
   ――引数queryがNULLまたは
   <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> &lt; 0の場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_UNCONNECTED</ReturnValue> 
    <!-- if procedure is unconnected. -->
    ――未接続なプロシージャの場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_COPY</ReturnValue> <!-- if COPY TO/FROM stdin.-->
    ――COPY TO/FROM stdinの場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_CURSOR</ReturnValue> 
    <!-- if DECLARE/CLOSE CURSOR, FETCH. -->
    ――DECLARE/CLOSE CURSOR、FETCHの場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_TRANSACTION</ReturnValue> <!-- if BEGIN/ABORT/END.-->
   ――BEGIN/ABORT/ENDの場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_OPUNKNOWN</ReturnValue>
   <!--  if type of query is unknown (this shouldn't occur). -->
   ――未知の問い合わせタイプの場合（これは起こるべきではありません）
</Member>
</SimpleList>

</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIEXEC-3">
<TITLE><!-- Algorithm -->アルゴリズム
</TITLE>
<para><!-- <FUNCTION>SPI_exec</FUNCTION> performs the following: -->
      <FUNCTION>SPI_exec</FUNCTION>は以下を行います。
</para>
<!--<VARIABLELIST>
<VARLISTENTRY>
<TERM>&bull;
</TERM>-->
<itemizedlist>
<LISTITEM>
<para> <!-- 
   Disconnects your procedure from the SPI manager and frees all memory
   allocations made by your procedure via <Function>palloc</Function> since 
   the <Function>SPI_connect</Function>. 
   These allocations can't be used any more! See Memory management. -->

  ユーザー定義のプロシージャをSPIマネージャから切断し、<Function> SPI_connect</Function>を実行してからそのプロシージャが<Function>palloc</Function>を使用して獲得したメモリをすべて解放します。このメモリはもはや使用できません（<xref linkend="spi-memory"><!--メモリ管理の項-->を参照してください）。


</para>
</LISTITEM>
<!--</VARLISTENTRY>
</VARIABLELIST>-->
</itemizedlist>

</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIEXEC-4">
<TITLE>--><!--Structures--><!--構造
</TITLE>
<para> 
   If <ReturnValue>SPI_OK_SELECT</ReturnValue> returned and SPI_processed > 0 
   then you may use the global pointer SPITupleTable *SPI_tuptable to access 
   the selected tuples. 

   もし<ReturnValue>SPI_OK_SELECT</ReturnValue>が返されSPI_processed > 0である場合、グローバルポインタSPITupleTable *SPI_tuptableを使って選択されたタプルにアクセスすることが可能です。

<para>
    Structure SPITupleTable is defined in spi.h: 
   構造体SPITupleTableはspi.hの中で定義されています。
<programlisting>
   typedef struct
   {
       uint32      alloced;        /* # of alloced vals */
       uint32      free;           /* # of free vals */
       TupleDesc   tupdesc;        /* tuple descriptor */
       HeapTuple  *vals;           /* tuples */
   } SPITupleTable;
</programlisting>

<para>
    
   HeapTuple *vals is an array of pointers to tuples. TupleDesc tupdesc is
   a tuple descriptor which you may pass to SPI functions dealing with
   tuples. 

   HeapTuple *valsはタプルへのポインタの配列です。TupleDesc tupdescはタプルを扱うSPI関数へ渡すことのできるタプルの記述子です。
   

<para>
   NOTE! Functions <Function>SPI_exec</Function>, <Function>SPI_execp</Function>
   and <Function>SPI_prepare</Function> change both
   SPI_processed and SPI_tuptable (just the pointer, not the contents of the
   structure)!  So, save them in local procedure variables if you need them.
  
   注意! 関数<Function>SPI_exec</Function>、<Function>SPI_execp</Function>そして<Function>SPI_prepare</Function>は、SPI_processedとSPI_tuptableの両方を変えます(ポインタのみで、構造体の内容ではありません)! ですから、必要ならばそれらはローカルプロシージャ変数に保存してください。
<para>
   Also NOTE, that <Function>SPI_finish</Function> frees and makes 
   all SPITupleTables unusable! (See Memory management).
   さらに、<Function>SPI_finish</Function>はすべてのSPITupleTablesを解放し使用不可能にしてしまうので注意してください!(<xref linkend="spi-memory">を参照)。

</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIPREPARE">
<REFMETA>
<REFENTRYTITLE>SPI_prepare</REFENTRYTITLE>
<REFMISCINFO>SPI - Plan Preparation</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_prepare
</REFNAME>
<REFPURPOSE>
   <!-- Connects your procedure to the SPI manager. -->
   ユーザー定義のプロシージャをSPIマネージャに接続します。<indexterm><primary>SPI_prepare</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_prepare</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_prepare</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="SPIまねーじゃ">SPIマネージャ</secondary><tertiary sortas="せつぞく">接続</tertiary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIPREPARE-1"><PRIMARY>SPI</PRIMARY><SECONDARY>connecting</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIPREPARE-2"><PRIMARY>SPI_prepare</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_prepare(<REPLACEABLE CLASS="PARAMETER">query</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">nargs</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">argtypes</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIPREPARE-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
<REPLACEABLE CLASS="PARAMETER">query</REPLACEABLE>
</TERM>
<LISTITEM>
<para><!-- 
Query string -->問い合わせ文字列
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
<REPLACEABLE CLASS="PARAMETER">nargs</REPLACEABLE>
</TERM>
<LISTITEM>
<para><!-- 
Number of input parameters ($1 ... $nargs - as in SQL-functions) -->
入力パラメータ（SQL関数における$1 ... $nargs）の数

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
<REPLACEABLE CLASS="PARAMETER">argtypes</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Pointer list of type <Acronym>OID</Acronym>s to input arguments -->
入力引数を示す<Acronym>OID</Acronym>型のポインタのリスト

</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIPREPARE-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>void *
</TERM>
<LISTITEM>
<para>
<!-- Pointer to an execution plan (parser+planner+optimizer) -->
実行計画（パーサー＋プランナ＋オプティマイザ）を示すポインタ

</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIPREPARE-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
<!-- 
   creates and returns an execution plan (parser+planner+optimizer) but doesn't
   execute the query. Should only be called from a connected procedure. -->

<FUNCTION>SPI_prepare</FUNCTION>は、実行プラン（パーサー＋プランナ＋オプティマイザ）を生成し、それを返します。問い合わせは実行しません。接続済みのプロシージャからのみ呼び出してください。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIPREPARE-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para> <!-- 
   nargs is number of parameters ($1 ... $nargs - as in SQL-functions),
   and nargs may be 0 only if there is not any $1 in query. -->

   引数nargsはパラメータ（SQL関数の$1 ... $nargs）の数であり、問い合わせに$1が存在しない場合にのみ0となります。

</para>
<para><!-- 
   Execution of prepared execution plans is sometimes much faster so this
   feature may be useful if the same query will be executed many times.
   -->
   生成済み実行プランの実行は非常に高速な場合がありますので、同じ問い合わせを何回も実行するような場合に、この機能は有益です。


</para>
<para> <!-- 
The plan returned by <Function>SPI_prepare</Function> may be used only 
in current invocation of the procedure since <Function>SPI_finish</Function> 
frees memory allocated for a plan. 
See <Function>SPI_saveplan</Function>. -->

<Function>SPI_prepare</Function>で返されるプランは、<Function>SPI_finish</Function>が割り当てたメモリ領域を解放しますので、現在処理中のプロシージャ中でのみで使用できます。<Function>SPI_saveplan</Function>を参照してください。

</para>
<para><!-- 
   If successful, a non-null pointer will be returned. Otherwise, you'll get
   a NULL plan.  In both cases SPI_result will be set like the value returned
   by SPI_exec, except that it is set to 
   <ReturnValue>SPI_ERROR_ARGUMENT</ReturnValue> if query is NULL or nargs < 0 or nargs > 0 &amp;&amp; argtypes
   is NULL. -->

成功した場合、非NULLのポインタが返ります。失敗した場合はNULLの実行プランが返ります。どちらにしてもSPI_execの戻り値と同様に、SPI_resultが設定されます。ただし引数queryがNULLの場合、nargs &lt; 0の場合、nargs &gt; 0かつ引数argtypesがNULLの場合は、<ReturnValue>SPI_ERROR_ARGUMENT</ReturnValue>が設定されます。


</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIPREPARE-3">
<TITLE>Algorithm 
</TITLE>
<para><FUNCTION>SPI_prepare</FUNCTION> performs the following: 

</para>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>&bull;
</TERM>
<LISTITEM>
<para>
TBD
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIPREPARE-4">
<TITLE>Structures
</TITLE>
<para>None 
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPISAVEPLAN">
<REFMETA>
<REFENTRYTITLE>SPI_saveplan</REFENTRYTITLE>
<REFMISCINFO>SPI - Plan Storage</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_saveplan
</REFNAME>
<REFPURPOSE>
   <!-- Saves a passed plan -->渡されたプランを保存します。<indexterm><primary>SPI_saveplan</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_saveplan</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_saveplan</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="ぷらん">プラン</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPISAVEPLAN-1"><PRIMARY>SPI</PRIMARY><SECONDARY>connecting</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPISAVEPLAN-2"><PRIMARY>SPI_saveplan</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_saveplan(<REPLACEABLE CLASS="PARAMETER">plan</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPISAVEPLAN-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
void *<REPLACEABLE CLASS="PARAMETER">query</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Passed plan -->渡されたプラン
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPISAVEPLAN-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>void *
</TERM>
<LISTITEM>
<para>
<!-- Execution plan location. NULL if unsuccessful. -->
実行プランの保存場所。失敗の場合はNULL

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>SPI_result
</TERM>
<LISTITEM>
<SimpleList>
<Member>
   <ReturnValue>SPI_ERROR_ARGUMENT</ReturnValue><!-- if plan is NULL -->
   ――引数planがNULLの場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_UNCONNECTED</ReturnValue> 
    <!-- if procedure is un-connected -->――未接続プロシージャの場合
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPISAVEPLAN-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
<!-- 
   stores a plan prepared by <Function>SPI_prepare</Function> in safe memory
   protected from freeing by <Function>SPI_finish</Function> or the 
   transaction manager. -->

<FUNCTION>SPI_saveplan</FUNCTION>は、<FUNCTION>SPI_prepare</FUNCTION>によって作成されたプランを<FUNCTION>SPI_finish</FUNCTION>やトランザクションマネージャによって行われるメモリの解放の影響を受けない安全なメモリ領域に保存します。

</para>
<para><!-- 
   In the current version of <ProductName>Postgres</ProductName> there 
   is no ability to store prepared plans in the system
   catalog and fetch them from there for execution. This will be implemented
   in future versions.

   As an alternative, there is the ability to reuse prepared plans in the
   consequent invocations of your procedure in the current session.
   Use <Function>SPI_execp</Function> to execute this saved plan. -->

   現状の<ProductName>Postgres</ProductName>では、準備済みプランをシステムカタログに保存しておき、実行時にそれを取り出すといった機能はありません。この機能は将来実装されるでしょう。代わりに、同じセッションの中で、後から起動されるプロシージャが準備済みプランを再利用する機能はあります。この保存されたプランを実行するには、<Function>SPI_execp</Function>を使用してください。
</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPISAVEPLAN-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para><!-- 
   <Function>SPI_saveplan</Function> saves a passed plan (prepared by 
   <Function>SPI_prepare</Function>) in memory protected from freeing by 
   <Function>SPI_finish</Function> and by the transaction manager and
   returns a pointer to the saved plan.  You may save the pointer returned in
   a local variable.  Always check if this pointer is NULL or not either when
   preparing a plan or using an already prepared plan in SPI_execp (see below).
   -->

   <Function>SPI_saveplan</Function>は、（<Function>SPI_prepare</Function>によって準備され）渡された実行プランを<Function>SPI_finish</Function>やトランザクションマネージャによって行われるメモリの解放の影響を受けない安全なメモリ領域に保存し、その保存した実行プランを示すポインタを返します。返されたポインタをローカル変数に保存することもできます。実行プランを準備するときやSPI_execp（後述）で既存の準備済み実行プランを使用するときは、常にこのポインタがNULLかどうかを点検してください。
</para>

<Note>
<para>
   <!-- 
   If one of the objects (a relation, function, etc.) referenced by the prepared
   plan is dropped during your session (by your backend or another process) 
   then the results of <Function>SPI_execp</Function> for this plan will 
   be unpredictable. -->

   セッション中に準備済み実行プランが参照する（リレーション、関数などの）オブジェクトが1つでも（バックエンドや他のプロセスによって）削除されると、この実行プランを使った<Function>SPI_execp</Function>の結果は予測できないものになります。

</para>
</Note>

</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPISAVEPLAN-3">
<TITLE>Algorithm 
</TITLE>
<para><FUNCTION>SPI_saveplan</FUNCTION> performs the following: 

</para>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>&bull;
</TERM>
<LISTITEM>
<para>
TBD
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPISAVEPLAN-4">
<TITLE>Structures 
</TITLE>
<para>None 
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIEXECP">
<REFMETA>
<REFENTRYTITLE>SPI_execp</REFENTRYTITLE>
<REFMISCINFO>SPI - Plan Execution</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_execp
</REFNAME>
<REFPURPOSE>
<!-- Executes a plan from <Function>SPI_saveplan</Function> -->
<Function>SPI_saveplan</Function>によって得られる実行プランを実行します。<indexterm><primary>SPI_execp</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_execp</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_execp</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="じっこうぷらん">実行プラン</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIEXECP-1"><PRIMARY>SPI</PRIMARY><SECONDARY>connecting</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIEXECP-2"><PRIMARY>SPI_execp</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_execp(<REPLACEABLE CLASS="PARAMETER">plan</REPLACEABLE>,
<REPLACEABLE CLASS="PARAMETER">values</REPLACEABLE>,
<REPLACEABLE CLASS="PARAMETER">nulls</REPLACEABLE>,
<REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIEXECP-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
void *<REPLACEABLE CLASS="PARAMETER">plan</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Execution plan -->実行プラン
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
Datum *<REPLACEABLE CLASS="PARAMETER">values</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Actual parameter values -->実パラメータの値
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
char *<REPLACEABLE CLASS="PARAMETER">nulls</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Array describing what parameters get NULLs -->
どのパラメータがNULLを許すかを記述した配列
</para>

<SimpleList>
<!-- <Member>'n' indicates NULL allowed</Member>
<Member>' ' indicates NULL not allowed</Member> -->

<Member>'n'――NULLを許すことを示します。</Member>
<Member>' '――NULLを許さないことを示します。</Member> 

</SimpleList>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Number of tuples for which plan is to be executed -->
計画が実行対象とするタプルの数

</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIEXECP-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>int
</TERM>
<LISTITEM>
<para>
   <!-- 
   Returns the same value as <Function>SPI_exec</Function> as well as -->
   <Function>SPI_exec</Function>と同様に、次のものを返します。
<SimpleList>
<Member>
 <ReturnValue>SPI_ERROR_ARGUMENT</ReturnValue>
 <!-- if <REPLACEABLE CLASS="PARAMETER">plan</REPLACEABLE>
 is NULL or <REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> &lt; 0
 -->
――引数<REPLACEABLE CLASS="PARAMETER">plan</REPLACEABLE>がNULLまたは引数<REPLACEABLE CLASS="PARAMETER">tcount</REPLACEABLE> < 0の場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_PARAM</ReturnValue>
<!-- 
 if <REPLACEABLE CLASS="PARAMETER">values</REPLACEABLE>
 is NULL
 and <REPLACEABLE CLASS="PARAMETER">plan</REPLACEABLE>
 was prepared with some parameters. -->

――引数<REPLACEABLE CLASS="PARAMETER">values</REPLACEABLE>がNULLかつ、引数<REPLACEABLE CLASS="PARAMETER">plan</REPLACEABLE>が何かしらの引数を必要とする場合
</Member>
</SimpleList>
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>SPI_tuptable
</TERM>
<LISTITEM>
<para><!-- 
initialized as in <Function>SPI_exec</Function> if successful -->
――成功すると、<Function>SPI_exec</Function>と同じように初期化されます
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>SPI_processed
</TERM>
<LISTITEM>
<para><!-- 
initialized as in <Function>SPI_exec</Function> if successful -->
――成功すると、<Function>SPI_exec</Function>と同じように初期化されます
</para>
</listitem>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIEXECP-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
<!-- 
   stores a plan prepared by <Function>SPI_prepare</Function> in safe memory
   protected from freeing by <Function>SPI_finish</Function> or the 
   transaction manager. -->

   <FUNCTION>SPI_execp</FUNCTION>は、<Function>SPI_prepare</Function>によって作成された実行プランを<Function>SPI_finish</Function>やトランザクションマネージャによって行われるメモリの解放の影響を受けない安全なメモリ領域に保存します。
</para>
<para>
   <!--
   In the current version of <ProductName>Postgres</ProductName> there is 
   no ability to store prepared plans in the system
   catalog and fetch them from there for execution. This will be implemented
   in future versions.

   As a work arround, there is the ability to reuse prepared plans in the
   consequent invocations of your procedure in the current session.
   Use <Function>SPI_execp</Function> to execute this saved plan. -->

   現状の<ProductName>Postgres</ProductName>では、準備済み実行プランをシステムカタログに保存しておき、実行時にそれを取り出すといった機能はありません。この機能は将来実装されるでしょう。代わりに、同じセッションの中で、後から起動されるプロシージャが準備済み実行プランを再利用する機能はあります。この保存された計画を実行するには、<Function>SPI_execp</Function>を使用してください。 

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIEXECP-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para><!-- 
   If <REPLACEABLE CLASS="PARAMETER">nulls</REPLACEABLE>
   is NULL then <Function>SPI_execp</Function> 
   assumes that all values (if any) are NOT NULL. -->

  引数<REPLACEABLE CLASS="PARAMETER">nulls</REPLACEABLE>がNULLの場合、<Function>SPI_execp</Function>は、（取り得る）すべての値は非NULLであるものとします。 
</para>

<Note>
<para>
   <!--  
   If one of the objects (a relation, function, etc.) referenced by the 
   prepared plan is dropped during your session (by your backend or 
   another process) then the results of <Function>SPI_execp</Function> 
   for this plan will be unpredictable. -->

   セッション中に準備済み実行プランが参照するオブジェクト（リレーションや関数など）が1つでも（バックエンドや他のプロセスによって）削除されると、この実行プランを使った<Function>SPI_execp</Function>の結果は予測できないものになります。


</para>
</Note>

</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIEXECP-3">
<TITLE>Algorithm
</TITLE>
<para><FUNCTION>SPI_execp</FUNCTION> performs the following:
</para>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>&bull;
</TERM>
<LISTITEM>
<para>
TBD
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIEXECP-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

</Sect1>

<Sect1 id="spi-interface-support">
<!-- <Title>Interface Support Functions</Title>-->
<Title>インターフェイスサポート関数</Title>

<para><!-- 
All functions described below may be used by connected and unconnected
procedures. -->
以下の関数はすべて、接続しているプロシージャでも、接続していないプロシージャでも使用できます。


</para>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPICOPYTUPLE">
<REFMETA>
<REFENTRYTITLE>SPI_copytuple</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Copy</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_copytuple
</REFNAME>
<REFPURPOSE>
<!-- Makes copy of tuple in upper Executor context -->
上位エクゼキュータのコンテキスト内のタプルのコピーを作成します。<indexterm><primary>SPI_copytuple</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_copytuple</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_copytuple</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="たぷるのこぴー">タプルのコピー</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPICOPYTUPLE-1"><PRIMARY>SPI</PRIMARY><SECONDARY>copying tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPICOPYTUPLE-2"><PRIMARY>SPI_copytuple</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_copytuple(<REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPICOPYTUPLE-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
HeapTuple <REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple to be copied -->コピー対象のタプル
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPICOPYTUPLE-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
HeapTuple
</TERM>
<LISTITEM>
<para>
<!-- Copied tuple -->コピーされたタプル
</para>
<SimpleList>
<Member>
 <!-- <ReturnValue>non-NULL</ReturnValue> -->
 <ReturnValue>非NULL</ReturnValue>
 <!-- if <REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
 is not NULL and the copy was successful -->

  ――引数<REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>がNULLでなく、
  コピーが成功した場合
</Member>
<Member>
   <ReturnValue>NULL</ReturnValue>
   <!-- only if <REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
 is NULL -->
   ――NULL引数<REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
   がNULLの場合のみ
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPICOPYTUPLE-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
<FUNCTION>SPI_copytuple</FUNCTION> 
  <!--  makes a copy of tuple in upper Executor context. 
  See the section on Memory Management. -->
  は、上位エクゼキュータのコンテキスト内のタプルのコピーを作成します。<xref linkend="spi-memory"><!--メモリ管理の項-->を参照してください。


</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPICOPYTUPLE-2">
<TITLE>--><!-- Usage --><!--使用法
</TITLE>
<para>
TBD
</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPICOPYTUPLE-3">
<TITLE>Algorithm 
</TITLE>

</REFSECT1>
<REFSECT1 ID="R1-SPI-SPICOPYTUPLE-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIMODIFYTUPLE">
<REFMETA>
<REFENTRYTITLE>SPI_modifytuple</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Modify</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_modifytuple
</REFNAME>
<REFPURPOSE>
<!-- Modifies tuple of relation -->
リレーション中のタプルを変更します。<indexterm><primary>SPI_modifytuple</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_modifytuple</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_modifytuple</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="たぷるのへんこう">タプルの変更</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIMODIFYTUPLE-1"><PRIMARY>SPI</PRIMARY><SECONDARY>modifying tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIMODIFYTUPLE-2"><PRIMARY>SPI_modifytuple</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_modifytuple(<REPLACEABLE CLASS="PARAMETER">rel</REPLACEABLE>, 
<REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE> , 
<REPLACEABLE CLASS="PARAMETER">nattrs</REPLACEABLE>, 
<REPLACEABLE CLASS="PARAMETER">attnum</REPLACEABLE> , 
<REPLACEABLE CLASS="PARAMETER">Values</REPLACEABLE> , 
<REPLACEABLE CLASS="PARAMETER">Nulls</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIMODIFYTUPLE-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
Relation <REPLACEABLE CLASS="PARAMETER">rel</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
対象となるリレーション
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
HeapTuple <REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple to be modified -->変更対象のタプル
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int <REPLACEABLE CLASS="PARAMETER">nattrs</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Number of attribute numbers in attnum -->
引数attnum内の属性番号の数
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int * <REPLACEABLE CLASS="PARAMETER">attnum</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Array of numbers of the attributes that are to be changed -->
変更対象の属性番号の配列
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
Datum * <REPLACEABLE CLASS="PARAMETER">Values</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- New values for the attributes specified -->
指定属性の変更後の値

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
char * <REPLACEABLE CLASS="PARAMETER">Nulls</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Which attributes are NULL, if any -->
どの属性がNULLを取り得るか
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIMODIFYTUPLE-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
HeapTuple
</TERM>
<LISTITEM>
<para>
<!-- New tuple with modifications -->
変更された新しいタプル
</para>

<SimpleList>
<Member>
 <!-- <ReturnValue>non-NULL</ReturnValue>
 if <REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
 is not NULL and the modify was successful -->

     <ReturnValue>NULL以外</ReturnValue>――引数<REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>がNULLでなく、かつ、変更が成功した場合

</Member>
<Member>
 <!-- only if <REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
 is NULL -->
   <ReturnValue>NULL</ReturnValue>――引数<REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>がNULLの場合のみ

</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
SPI_result
</TERM>
<LISTITEM>
<SimpleList>
<Member> 
   <ReturnValue>SPI_ERROR_ARGUMENT</ReturnValue> 
   <!-- if rel is NULL or tuple 
   is NULL or natts &le; 0 or
   attnum is NULL or Values is NULL. -->
   ――引数rel、tuple、attnum、ValuesのいずれかがNULL、または引数natts &le; 0の場合
</Member>
<Member>
   <ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue> 
   <!-- if there is an invalid 
   attribute number in attnum (attnum &le; 0 or &gt; number of
   attributes in tuple) -->

   ――引数arrnum中に無効な属性番号がある場合（attnum &le; 0または、&gt; タプル内の属性数の場合）
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIMODIFYTUPLE-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
<FUNCTION>SPI_modifytuple</FUNCTION> 
<!-- 
Modifies a tuple in upper Executor context. 
See the section on Memory Management. -->
は、上位エクゼキュータのコンテキスト内のタプルを変更します。<xref linkend="spi-memory"><!--メモリ管理の項-->を参照してください。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIMODIFYTUPLE-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para>
<!-- 
If successful, a pointer to the new tuple is returned. The new tuple is
allocated in upper Executor context (see Memory management). Passed tuple
is not changed. -->
成功すると、新しいタプルを示すポインタが返されます。新しいタプルは上位エクゼキュータのコンテキストに割り当てられています（<xref linkend="spi-memory"><!--メモリ管理の項-->を参照してください）。元のタプルは変更されません。

</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIMODIFYTUPLE-3">
<TITLE>Algorithm
</TITLE>
<para>
</para>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIMODIFYTUPLE-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIFNUMBER">
<REFMETA>
<REFENTRYTITLE>SPI_fnumber</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Information</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_fnumber
</REFNAME>
<REFPURPOSE>
<!-- Finds the attribute number for specified attribute -->
指定属性の属性番号を検索します。<indexterm><primary>SPI_fnumber</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_fnumber</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_fnumber</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="ぞくせいばんごうのけんさく">属性番号の検索</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIFNUMBER-1"><PRIMARY>SPI</PRIMARY><SECONDARY>decoding tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIFNUMBER-2"><PRIMARY>SPI_fnumber</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_fnumber(<REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">fname</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIFNUMBER-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
TupleDesc <REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple description -->対象タプルの記述

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
char * <REPLACEABLE CLASS="PARAMETER">fname</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Field name -->フィールド名
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIFNUMBER-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
int
</TERM>
<LISTITEM>
<para>
<!-- Attribute number -->属性番号
</para>
<SimpleList>
<Member>
<!-- Valid one-based index number of attribute -->1から始まる有効な属性番号
</Member>
<Member>
<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue> 
<!-- if the named attribute is not found -->
――指定属性名が存在しない場合
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIFNUMBER-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
   <!-- returns the attribute number for the attribute with name in fname.
   -->
<FUNCTION>SPI_fnumber</FUNCTION>は、引数fnameで指定された名前を持つ属性の属性番号を返します。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIFNUMBER-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para>
<!-- Attribute numbers are 1 based. -->属性番号は1から始まります。
</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIFNUMBER-3">
<TITLE>Algorithm
</TITLE>
<para>
</para>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIFNUMBER-4">
<TITLE>Structures
</TITLE>
<para>None 
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIFNAME">
<REFMETA>
<REFENTRYTITLE>SPI_fname</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Information</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_fname
</REFNAME>
<REFPURPOSE>
<!-- Finds the attribute name for the specified attribute -->
指定属性の属性名を検索します。<indexterm><primary>SPI_fname</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_fname</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_fname</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="ぞくせいばんごうのけんさく">属性番号の検索</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIFNAME-1"><PRIMARY>SPI</PRIMARY><SECONDARY>decoding tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIFNAME-2"><PRIMARY>SPI_fname</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_fname(<REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">fname</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIFNAME-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
TupleDesc <REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple description -->
     対象タプルの記述

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int <REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Attribute number -->属性番号
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIFNAME-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
char *
</TERM>
<LISTITEM>
<para>
<!-- Attribute name -->属性名
</para>
<SimpleList>
<Member>
<!-- NULL if fnumber is out of range -->
NULL引数fnumberが範囲外の場合
</Member>
<Member>
<!-- SPI_result set to
<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue> on error -->
エラーの場合は、SPI_resultに<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue>が設定されます。

</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIFNAME-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>

   <!-- returns the attribute name for the specified attribute. -->
<FUNCTION>SPI_fname</FUNCTION>は、指定された属性の属性名を返します。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIFNAME-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para>
<!-- Attribute numbers are 1 based. -->
属性番号は1から始まります。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIFNAME-3">
<TITLE><!-- Algorithm -->アルゴリズム
</TITLE>
<para>
<!-- Returns a newly-allocated copy of the attribute name. -->
新しく割り当てたメモリに属性名をコピーしたものを返します。

</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIFNAME-4">
<TITLE>Structures 
</TITLE>
<para>None 
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIGETVALUE">
<REFMETA>
<REFENTRYTITLE>SPI_getvalue</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Information</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_getvalue
</REFNAME>
<REFPURPOSE>
<!-- Returns the string value of the specified attribute -->
指定属性の値を文字列として返します。<indexterm><primary>SPI_getvalue</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_getvalue</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_getvalue</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="ぞくせいのあたい">属性の値</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIGETVALUE-1"><PRIMARY>SPI</PRIMARY><SECONDARY>decoding tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIGETVALUE-2"><PRIMARY>SPI_getvalue</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_getvalue(<REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIGETVALUE-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
HeapTuple <REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple to be examined -->処理対象のタプル
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
TupleDesc <REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple description -->対象タプルの記述

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int <REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Attribute number -->属性番号
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIGETVALUE-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
char *
</TERM>
<LISTITEM>
<para>
<!-- Attribute value or NULL if -->属性値。以下の場合はNULLが返ります
</para>
<SimpleList>
<Member>
<!-- attribute is NULL -->返す属性がNULLの場合
</Member>
<Member>
<!-- fnumber is out of range
(SPI_result set to
<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue>) -->
引数fnumberが範囲外の場合（SPI_resultは 
<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue>に設定されます）
</Member>
<Member>
<!-- no output function available
(SPI_result set to
<ReturnValue>SPI_ERROR_NOOUTFUNC</ReturnValue>) -->
出力関数がない場合（SPI_resultは 
<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue>に設定されます）

</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIGETVALUE-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
   <!-- returns an external (string) representation of the value of the 
   specified attribute. -->

<FUNCTION>SPI_getvalue</FUNCTION>は、指定属性の値の外部表現（文字列表現）を返します。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIGETVALUE-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para>
<!-- Attribute numbers are 1 based. -->
属性番号は1から始まります。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIGETVALUE-3">
<TITLE><!-- Algorithm -->アルゴリズム
</TITLE>
<para>
<!-- Allocates memory as required by the value. -->
その値を格納するために必要とされる分のメモリを割り当てます。

</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIGETVALUE-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIGETBINVAL">
<REFMETA>
<REFENTRYTITLE>SPI_getbinval</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Information</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_getbinval
</REFNAME>
<REFPURPOSE>
<!-- Returns the binary value of the specified attribute -->
指定された属性のバイナリ値を返します。<indexterm><primary>SPI_getbinval</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_getbinval</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_getbinval</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="ぞくせいのあたい">属性の値</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIGETBINVAL-1"><PRIMARY>SPI</PRIMARY><SECONDARY>decoding tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIGETBINVAL-2"><PRIMARY>SPI_getbinval</PRIMARY></INDEXTERM>-->

</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_getbinval(<REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>, 
<REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>, 
<REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>, 
<REPLACEABLE CLASS="PARAMETER">isnull</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIGETBINVAL-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
HeapTuple <REPLACEABLE CLASS="PARAMETER">tuple</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple to be examined -->処理対象タプル

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
TupleDesc <REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple description -->対象タプルの記述

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int <REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Attribute number -->属性番号
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIGETBINVAL-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
Datum
</TERM>
<LISTITEM>
<para>
<!-- Attribute binary value -->属性のバイナリ値

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
bool * <REPLACEABLE CLASS="PARAMETER">isnull</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- flag for null value in attribute -->
属性がnullかどうかを示すフラグ

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
SPI_result
</TERM>
<LISTITEM>
<SimpleList>
<Member>
<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue>
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIGETBINVAL-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
   <!-- returns the binary value of the specified attribute. -->
<FUNCTION>SPI_getbinval</FUNCTION>は、指定された属性のバイナリ値を返します。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIGETBINVAL-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para>
<!-- Attribute numbers are 1 based. -->
属性番号は1から始まります。
</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIGETBINVAL-3">
<TITLE><!-- Algorithm -->アルゴリズム
</TITLE>
<para>
<!-- Does not allocate new space for the binary value.-->
バイナリ値格納用には新しくメモリを割り当てません。

</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIGETBINVAL-4">
<TITLE>Structures 
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIGETTYPE">
<REFMETA>
<REFENTRYTITLE>SPI_gettype</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Information</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_gettype
</REFNAME>
<REFPURPOSE>
<!-- Returns the type name of the specified attribute -->
指定された属性の型名を返します。<indexterm><primary>SPI_gettype</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_gettype</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_gettype</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="ぞくせいのかた">属性の型</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIGETTYPE-1"><PRIMARY>SPI</PRIMARY><SECONDARY>decoding tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIGETTYPE-2"><PRIMARY>SPI_gettype</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_gettype(<REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIGETTYPE-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
TupleDesc <REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple description -->対象タプルの記述
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int <REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Attribute number -->属性番号
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIGETTYPE-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
char *
</TERM>
<LISTITEM>
<para>
<!-- The type name for the specified attribute number -->
指定された属性番号の型名

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
SPI_result
</TERM>
<LISTITEM>
<SimpleList>
<Member>
<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue>
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIGETTYPE-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!--Description -->説明
</TITLE>
<para>
   <!-- returns a copy of the type name for the specified attribute. -->
<FUNCTION>SPI_gettype</FUNCTION>は、指定された属性の型名のコピーを返します。
</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIGETTYPE-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para>
<!--Attribute numbers are 1 based. -->
属性番号は1から始まります。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIGETTYPE-3">
<TITLE><!-- Algorithm -->アルゴリズム
</TITLE>
<para>
<!-- Does not allocate new space for the binary value. -->
バイナリ値格納用には新しくメモリを割り当てません。
</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIGETTYPE-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIGETTYPEID">
<REFMETA>
<REFENTRYTITLE>SPI_gettypeid</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Information</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_gettypeid
</REFNAME>
<REFPURPOSE>
<!--
Returns the type <Acronym>OID</Acronym> of the specified attribute -->
指定された属性の<Acronym>OID</Acronym>型を返します。<indexterm><primary>SPI_gettypeid</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_gettypeid</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_gettypeid</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="ぞくせいのOID">属性のOID</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIGETTYPEID-1"><PRIMARY>SPI</PRIMARY><SECONDARY>decoding tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIGETTYPEID-2"><PRIMARY>SPI_gettypeid</PRIMARY></INDEXTERM>-->

</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_gettypeid(<REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>, 
<REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIGETTYPEID-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
TupleDesc <REPLACEABLE CLASS="PARAMETER">tupdesc</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input tuple description -->
対象タプルの記述

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
int <REPLACEABLE CLASS="PARAMETER">fnumber</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Attribute number -->
属性番号
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIGETTYPEID-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
<Acronym>OID</Acronym>
</TERM>
<LISTITEM>
<para>
<!-- 
The type <Acronym>OID</Acronym> for the specified attribute number -->
指定された属性番号のOID型

</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
SPI_result
</TERM>
<LISTITEM>
<SimpleList>
<Member>
<ReturnValue>SPI_ERROR_NOATTRIBUTE</ReturnValue>
</Member>
</SimpleList>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIGETTYPEID-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>

   <!-- 
   returns the type <Acronym>OID</Acronym> for the specified attribute. -->
<FUNCTION>SPI_gettypeid</FUNCTION>は、指定された属性の<Acronym>OID</Acronym>型を返します。

</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIGETTYPEID-2">
<TITLE><!-- Usage -->使用法
</TITLE>
<para>
<!-- Attribute numbers are 1 based. -->属性番号は1から始まります。
</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIGETTYPEID-3">
<TITLE>Algorithm
</TITLE>
<para>
TBD
</para>
</REFSECT1>
<REFSECT1 ID="R1-SPI-SPIGETTYPEID-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIGETRELNAME">
<REFMETA>
<REFENTRYTITLE>SPI_getrelname</REFENTRYTITLE>
<REFMISCINFO>SPI - Tuple Information</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_getrelname
</REFNAME>
<REFPURPOSE>
<!-- Returns the name of the specified relation -->
指定されたリレーションの名前を返します。<indexterm><primary>SPI_getrelname</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_getrelname</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_getrelname</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="りれーしょんのなまえ">リレーションの名前</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIGETRELNAME-1"><PRIMARY>SPI</PRIMARY><SECONDARY>decoding tuples</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIGETRELNAME-2"><PRIMARY>SPI_getrelname</PRIMARY></INDEXTERM>-->

</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_getrelname(<REPLACEABLE CLASS="PARAMETER">rel</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIGETRELNAME-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
Relation <REPLACEABLE CLASS="PARAMETER">rel</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Input relation -->
対象リレーション
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIGETRELNAME-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
char *
</TERM>
<LISTITEM>
<para>
<!-- The name of the specified relation -->
指定されたリレーションの名前

</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIGETRELNAME-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
   <!-- returns the name of the specified relation. -->
<FUNCTION>SPI_getrelname</FUNCTION>は指定されたリレーションの名前を返します。
</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIGETRELNAME-2">
<TITLE>Usage
</TITLE>
<para>
TBD
</para>
</REFSECT1>
-->
<REFSECT1 ID="R1-SPI-SPIGETRELNAME-3">
<TITLE><!-- Algorithm -->アルゴリズム
</TITLE>
<para>
<!-- Copies the relation name into new storage. -->
リレーション名は新しく割り当てたメモリに格納されます。
</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIGETRELNAME-4">
<TITLE>
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIPALLOC">
<REFMETA>
<REFENTRYTITLE>SPI_palloc</REFENTRYTITLE>
<REFMISCINFO>SPI - Memory Management</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_palloc
</REFNAME>
<REFPURPOSE>
<!--Allocates memory in upper Executor context -->
上位エクゼキュータのコンテキスト内にメモリを割り当てます。<indexterm><primary>SPI_palloc</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_palloc</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_palloc</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="めもりわりあて">メモリ割り当て</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIPALLOC-1"><PRIMARY>SPI</PRIMARY><SECONDARY>allocating space</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIPALLOC-2"><PRIMARY>SPI_palloc</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_palloc(<REPLACEABLE CLASS="PARAMETER">size</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIPALLOC-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
Size <REPLACEABLE CLASS="PARAMETER">size</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Octet size of storage to allocate -->
割り当てるメモリのバイト数

</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIPALLOC-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
void *
</TERM>
<LISTITEM>
<para>
<!-- New storage space of specified size -->
指定されたサイズで新しく割り当てたメモリ
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIPALLOC-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>
   <!-- 
   allocates memory in upper Executor context. See section on memory management.
   -->
<FUNCTION>SPI_palloc</FUNCTION>は、上位エクゼキュータのコンテキスト内のメモリを割り当てます。<xref linkend="spi-memory"><!--メモリ管理の項-->を参照してください。

</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIPALLOC-2">
<TITLE>Usage
</TITLE>
<para>
TBD
</para>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIPALLOC-3">
<TITLE>Algorithm
</TITLE>
<para>
TBD
</para>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIPALLOC-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIREPALLOC">
<REFMETA>
<REFENTRYTITLE>SPI_repalloc</REFENTRYTITLE>
<REFMISCINFO>SPI - Memory Management</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>SPI_repalloc
</REFNAME>
<REFPURPOSE>
<!-- Re-allocates memory in upper Executor context -->
上位エクゼキュータ内のメモリの再割り当てを行います。<indexterm><primary>SPI_repalloc</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_repalloc</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_repalloc</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="めもりのさいわりあて">メモリの再割り当て</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIREPALLOC-1"><PRIMARY>SPI</PRIMARY><SECONDARY>allocating space</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIREPALLOC-2"><PRIMARY>SPI_repalloc</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_repalloc(<REPLACEABLE CLASS="PARAMETER">pointer</REPLACEABLE>, <REPLACEABLE CLASS="PARAMETER">size</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIREPALLOC-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
void * <REPLACEABLE CLASS="PARAMETER">pointer</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Pointer to existing storage -->
割り当て済みのメモリを示すポインタ
</para>
</LISTITEM>
</VARLISTENTRY>
<VARLISTENTRY>
<TERM>
Size <REPLACEABLE CLASS="PARAMETER">size</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Octet size of storage to allocate -->
割り当てるメモリのバイト数

</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIREPALLOC-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
void *
</TERM>
<LISTITEM>
<para>
<!-- 
New storage space of specified size with contents copied from existing area
-->
割り当て済みの領域の内容をコピーした新しいメモリ領域

</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIREPALLOC-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>

   <!-- 
   re-allocates memory in upper Executor context. 
   See section on memory management. -->
<FUNCTION>SPI_repalloc</FUNCTION>は、上位エクゼキュータのコンテキスト内のメモリの再割り当てを行います。<xref linkend="spi-memory"><!--メモリ管理の項-->を参照してください。

</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIREPALLOC-2">
<TITLE>Usage
</TITLE>
<para>
TBD
</para>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIREPALLOC-3">
<TITLE>Algorithm
</TITLE>
<para>
TBD
</para>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIREPALLOC-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

<!-- *********************************************** -->
<!-- *********************************************** -->
<!-- *********************************************** -->

<REFENTRY ID="SPI-SPIPFREE">
<REFMETA>
<REFENTRYTITLE>SPI_pfree</REFENTRYTITLE>
<REFMISCINFO>SPI - Memory Management</REFMISCINFO>
</REFMETA>
<REFNAMEDIV>
<REFNAME>
</REFNAME>
<REFPURPOSE>
<!-- Frees memory from upper Executor context -->
上位エクゼキュータのコンテキストのメモリを解放します。<indexterm><primary>SPI_pfree</primary></indexterm><indexterm><primary>SPI</primary><secondary sortas="かんすう">関数</secondary><tertiary>SPI_pfree</tertiary></indexterm><indexterm><primary sortas="かんすう">関数</primary><secondary>SPI_pfree</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="めもりのかいほう">メモリの解放</secondary></indexterm>
</REFPURPOSE>
<!--<INDEXTERM ID="IX-SPI-SPIPFREE-1"><PRIMARY>SPI</PRIMARY><SECONDARY>allocating space</SECONDARY></INDEXTERM>-->
<!--<INDEXTERM ID="IX-SPI-SPIPFREE-2"><PRIMARY>SPI_pfree</PRIMARY></INDEXTERM>-->
</REFNAMEDIV>
<REFSYNOPSISDIV>
<REFSYNOPSISDIVINFO>
<DATE>1997-12-24</DATE>
</REFSYNOPSISDIVINFO>
<synopsis>
SPI_pfree(<REPLACEABLE CLASS="PARAMETER">pointer</REPLACEABLE>)
</SYNOPSIS>

<REFSECT2 ID="R2-SPI-SPIPFREE-1">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Inputs -->入力
</TITLE>
<VARIABLELIST>
<VARLISTENTRY>
<TERM>
void * <REPLACEABLE CLASS="PARAMETER">pointer</REPLACEABLE>
</TERM>
<LISTITEM>
<para>
<!-- Pointer to existing storage -->割り当て済みのメモリを示すポインタ
</para>
</LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>
</REFSECT2>

<REFSECT2 ID="R2-SPI-SPIPFREE-2">
<REFSECT2INFO>
<DATE>1997-12-24</DATE>
</REFSECT2INFO>
<TITLE><!-- Outputs -->出力
</TITLE>
<!--<VARIABLELIST>
<VARLISTENTRY>
<TERM>-->
<para><!-- None -->なし</para>
<!--</TERM>
<LISTITEM></LISTITEM>
</VARLISTENTRY>
</VARIABLELIST>-->
</REFSECT2>
</REFSYNOPSISDIV>

<REFSECT1 ID="R1-SPI-SPIPFREE-1">
<REFSECT1INFO>
<DATE>1997-12-24</DATE>
</REFSECT1INFO>
<TITLE><!-- Description -->説明
</TITLE>
<para>

   <!-- 
   frees memory in upper Executor context. See section on memory management.
   -->

<FUNCTION>SPI_pfree</FUNCTION>は、上位エクゼキュータコンテキストのメモリを解放します。<xref linkend="spi-memory"><!--メモリ管理の項-->を参照してください。

</para>
</REFSECT1>
<!--
<REFSECT1 ID="R1-SPI-SPIPFREE-2">
<TITLE>Usage
</TITLE>
<para>
TBD
</para>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIPFREE-3">
<TITLE>Algorithm
</TITLE>
<para>
TBD
</para>
</REFSECT1>
-->
<!--
<REFSECT1 ID="R1-SPI-SPIPFREE-4">
<TITLE>Structures
</TITLE>
<para>None
</para>
</REFSECT1>
-->
</REFENTRY>

</Sect1>

<Sect1 id="spi-memory">
<!-- <Title>Memory Management</Title>-->
<Title>メモリ管理</Title>
<indexterm><primary sortas="めもりかんり">メモリ管理</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary sortas="めもりかんり">メモリ管理</secondary></indexterm><indexterm><primary>SPI</primary><secondary sortas="めもりかんり">メモリ管理</secondary></indexterm>
<para>
<!--  
   Server allocates memory in memory contexts in such way that allocations
made in one context may be freed by context destruction without affecting
allocations made in other contexts. All allocations (via 
<Function>palloc</Function>, etc) are made in the context that is chosen 
as the current one. You'll get unpredictable results if you'll try to free 
(or reallocate) memory allocated not in current context. -->

サーバーはメモリコンテキスト内でメモリの割り当てを行います。あるメモリコンテキストで割り当てられたメモリは、そのコンテキストを破壊することによって、他のコンテキストで割り当てられたメモリに影響を与えることなく解放できます。<Function>palloc</Function>などにより割り当てられたメモリはすべて、現在のコンテキストとして選ばれたコンテキスト内に作成されています。現在のコンテキストの外部に割り当てられたメモリを解放（または、再割り当て）を行おうとした場合、予期できない結果を得ることになります。

</para>

<para> <!-- 
   Creation and switching between memory contexts are subject of SPI manager
memory management. -->
メモリコンテキストの生成と切り替えはSPIマネージャの持つメモリ管理機能によって行われます。

</para>

<para>
<!--
   SPI procedures deal with two memory contexts: upper Executor memory
context and procedure memory context (if connected). -->

SPIプロシージャは2つのメモリコンテキストを扱います。上位エグゼキュータのメモリコンテキストと（接続済みの場合）プロシージャメモリコンテキストです。

</para>

<para>
<!-- 
   Before a procedure is connected to the SPI manager, current memory context
is upper Executor context so all allocation made by the procedure itself via
<Function>palloc</Function>/<Function>repalloc</Function> or by SPI utility 
functions before connecting to SPI are made in this context. -->

SPIマネージャにプロシージャが接続されるまでは、現在のメモリコンテキストは上位エクゼキュータコンテキストになっています。ですので、プロシージャ自体が<Function>palloc</Function>、<Function>repalloc</Function>、または、SPIユーティリティ関数を使って生成する割り当てメモリはすべてこのコンテキストに作成されます。

</para>

<para>
<!--
   After <Function>SPI_connect</Function> is called current context is 
the procedure's one.  All allocations made via <Function>palloc</Function>/
<Function>repalloc</Function> or by SPI utility functions (except
for <Function>SPI_copytuple</Function>, <Function>SPI_modifytuple</Function>,
 <Function>SPI_palloc</Function> and <Function>SPI_repalloc</Function>) are
made in this context. -->

<Function>SPI_connect</Function>が呼び出されると、現在のコンテキストはプロシージャのコンテキストになります。<Function>palloc</Function>、<Function>repalloc</Function>、SPIユーティリティ関数（<Function>SPI_copytuple</Function>、<Function>SPI_modifytuple</Function>、<Function>SPI_palloc</Function>、<Function>SPI_repalloc</Function>を除く）を使って生成した割り当てメモリはこのコンテキストに作成されます。
</para>

<para>
<!-- 
   When a procedure disconnects from the SPI manager (via 
<Function>SPI_finish</Function>) the current context is restored to 
the upper Executor context and all allocations made in the procedure 
memory context are freed and can't be used any more! -->

プロシージャが（<Function>SPI_finish</Function>を使って）SPIマネージャから切断されると、現在のコンテキストは上位エクゼキュータのコンテキストに戻され、プロシージャメモリコンテキストに作成された割り当てメモリは解放され、二度と使えなくなります。

</para>

<para>
   <!-- 
   If you want to return something to the upper Executor then you have to
allocate memory for this in the upper context! -->

上位エクゼキュータに何かを返したい場合、そのためのメモリを上位コンテキストに割り当てなければいけません。

</para>

<para>
<!-- 
   SPI has no ability to automatically free allocations in the upper Executor
context! -->
SPIは上位エクゼキュータに割り当てたメモリを自動的に解放する機能を持ちません。

</para>

<para>
   <!-- 
   SPI automatically frees memory allocated during execution of a query when
this query is done! -->
問い合わせが完了すると、SPIは問い合わせ実行中に割り当てたメモリを自動的に解放します。

</para>

</Sect1>

<Sect1 id="spi-visibility">
<!-- <Title>Visibility of Data Changes</Title> -->
<Title>データ変更の可視性</Title>

<para>
<!-- <ProductName>Postgres</ProductName> data changes visibility rule: during a 
query execution, data changes made by the query itself (via SQL-function, 
SPI-function, triggers) are invisible to the query scan.  
For example, in query

   INSERT INTO a SELECT * FROM a

   tuples inserted are invisible for SELECT's scan.  In effect, this
duplicates the database table within itself (subject to unique index
rules, of course) without recursing. -->

<ProductName>Postgres</ProductName>でのデータ変更時の可視性規則は以下のとおりです。問い合わせの実行中、その問い合わせ自身によって（SQL関数、SPI関数、トリガ経由で）なされたデータの変更はその問い合わせのスキャンからは不可視となります。たとえば、以下のような問い合わせでは、挿入されたタプルはSELECTスキャンからは不可視となります。<indexterm><primary>SPI</primary><secondary sortas="かしせい">可視性</secondary></indexterm>
</para>

<programlisting>
   INSERT INTO a SELECT * FROM a
</programlisting>

<para>
このため、この問い合わせはデータベースのテーブルを再帰処理することなく（もちろん、一意性インデックス規則にしたがって）二重化します。
</para>

<para>
   <!-- 
   Changes made by query Q are visible to queries that are started after
query Q, no matter whether they are started inside Q (during the execution
of Q) or after Q is done. -->

   問い合わせQによりなされる変更は、問い合わせQの後に開始した問い合わせに対しては可視です。この問い合わせがQの内側で（Qの実行中に）開始されたのか、Qの実行が終わってから開始されたのかについては問いません。

</para>
</Sect1>

<Sect1 id="spi-examples">
<!-- <Title>Examples</Title> -->
<Title>例</Title>

<para>
   <!--
   This example of SPI usage demonstrates the visibility rule.
   There are more complex examples in src/test/regress/regress.c and
in contrib/spi. -->

   このSPIを使った例は可視性規則を説明しています。src/test/regress/regress.cとcontrib/spiに、さらに複雑な例があります。

</para>

<para>
   <!-- 
   This is a very simple example of SPI usage. The procedure execq accepts
an SQL-query in its first argument and tcount in its second, executes the
query using SPI_exec and returns the number of tuples for which the query
executed: -->

これは非常に簡単なSPIを使った例です。execqプロシージャは1つ目の引数としてSQL問い合わせを、2つ目の引数としてtcountをとり、SPI_execを使って問い合わせを実行し、問い合わせの対象となったタプルの数を返します。
</para>

<programlisting>
#include "executor/spi.h" /* SPI を使うためにはこれが必要です */
<!--  /* this is what you need to work with SPI */ -->

int execq(text *sql, int cnt);

int
execq(text *sql, int cnt)
{
    char *query;
    int ret;
    int proc;

    <!-- /* Convert given TEXT object to a C string */ -->
    /* 与えられた TEXT オブジェクトを C の文字列に変換します */
    query = DatumGetCString(DirectFunctionCall1(textout,
                                                PointerGetDatum(sql)));

    SPI_connect();
    
    ret = SPI_exec(query, cnt);
    
    proc = SPI_processed;
<!--    /*
     * If this is SELECT and some tuple(s) fetched -
     * returns tuples to the caller via elog (NOTICE).
     */ -->

     /*
     * SELECT 問い合わせで、複数のタプルが取得された場合、
     * elog(NOTICE) を使って、タプルを呼び出し元に返します。
     */

    if ( ret == SPI_OK_SELECT && SPI_processed > 0 )
    {
        TupleDesc tupdesc = SPI_tuptable->tupdesc;
        SPITupleTable *tuptable = SPI_tuptable;
        char buf[8192];
        int i,j;
        
        for (j = 0; j < proc; j++)
        {
            HeapTuple tuple = tuptable->vals[j];
            
            for (i = 1, buf[0] = 0; i <= tupdesc->natts; i++)
                sprintf(buf + strlen (buf), " %s%s",
                        SPI_getvalue(tuple, tupdesc, i),
                        (i == tupdesc->natts) ? " " : " |");
            elog (NOTICE, "EXECQ: %s", buf);
        }
    }

    SPI_finish();

    pfree(query);

    return (proc);
}
</programlisting>

<para>
   <!-- Now, compile and create the function: -->
    ここでコンパイルを行い、関数を作成します。 
</para>

<programlisting>
create function execq (text, int4) returns int4 as '...path_to_so' language 'c';
</programlisting>

<programlisting>
 
vac=> <userinput>select execq('create table a (x int4)', 0);</userinput>
execq
-----
    0
(1 row)

vac=> <userinput>insert into a values (execq('insert into a values (0)',0));</userinput>
INSERT 167631 1
vac=> <userinput>select execq('select * from a',0);</userinput>
<!-- NOTICE:EXECQ:  0 <<<  inserted by execq -->
NOTICE:EXECQ:  0 <<< execq によって挿入されたもの

<!-- NOTICE:EXECQ:  1 <<<  value returned by execq and inserted by upper INSERT
-->
NOTICE:EXECQ:  1 <<< execq によって返されたものと上の INSERT によって挿入
                     されたもの
execq
-----
    2
(1 row)

vac=> <userinput>select execq('insert into a select x + 2 from a',1);</userinput>
execq
-----
    1
(1 row)

vac=> <userinput>select execq('select * from a', 10);</userinput>
NOTICE:EXECQ:  0 

NOTICE:EXECQ:  1 

<!-- NOTICE:EXECQ:  2 <<<  0 + 2, only one tuple inserted - as specified -->
NOTICE:EXECQ:  2 <<< 指定された 0 + 2という値の 1 つのタプルのみが挿入
                     されます。
 

<!-- execq
-----
    3            <<<  10 is max value only, 3 is real # of tuples              
(1 row) -->

execq
-----
    3            <<<  10 は最大値を示すだけです。実際のタプル数は 3 となります。
(1 row)          

vac=> <userinput>delete from a;</userinput>
DELETE 3
vac=> <userinput>insert into a values (execq('select * from a', 0) + 1);</userinput>
INSERT 167712 1
vac=> <userinput>select * from a;</userinput>
<!-- x
-
1                <<<  no tuples in a (0) + 1 
(1 row)-->

x
-
1                <<<  a テーブルにタプルが存在しない状態(0) + 1 を行った結果
(1 row)           

vac=> <userinput>insert into a values (execq('select * from a', 0) + 1);</userinput>
NOTICE:EXECQ:  0 
INSERT 167713 1
vac=> <userinput>select * from a;</userinput>
<!-- x
-
1
2                <<< there was single tuple in a + 1  
(2 rows) -->         

x
-
1
2                <<< a テーブルに既存の 1 つのタプル + 1
(2 rows)

<!--  This demonstrates data changes visibility rule: -->
--   これはデータ変更に関する可視性規則を説明します。
 
vac=> <userinput>insert into a select execq('select * from a', 0) * x from a;</userinput>
NOTICE:EXECQ:  1 
NOTICE:EXECQ:  2 
NOTICE:EXECQ:  1 
NOTICE:EXECQ:  2 
NOTICE:EXECQ:  2 
INSERT 0 2
vac=> <userinput>select * from a;</userinput>
<!-- x
-
1
2
2                <<< 2 tuples * 1 (x in first tuple) 
6                <<< 3 tuples (2 + 1 just inserted) * 2 (x in second tuple)
(4 rows)             ^^^^^^^^ 
                     tuples visible to execq() in different invocations -->

x
-
1
2
2                <<< タプル数 2 * 1（2 * 1 番目のタプルの x の値）
6                <<< タプル数 3 * 2（2 + 挿入された 1 * 2 番目のタプルの値）
(4 rows)             ^^^^^^^^^^ 
                     execq()の異なる呼び出しで見ることができるタプル
</programlisting>
</Sect1>
</Chapter>
