<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/plperl.sgml,v 1.3 2001/05/31 07:53:04 junichi Exp $
-->

<chapter id="plperl">
<!-- <title>PL/Perl - Perl Procedural Language</title> -->
 <title>PL/Perl――Perlによる手続き言語</title>
<indexterm><primary>PL/Perl</primary></indexterm><indexterm><primary sortas="げんご">言語</primary><secondary>PL/Perl</secondary></indexterm><indexterm><primary>Perl</primary></indexterm><indexterm><primary>PostgreSQL</primary><secondary>PL/Perl</secondary></indexterm>
 <para>
<!-- PL/Perl allows you to write functions in the Perl programming
  language that may be used in SQL queries as if they were built into
  <productname>Postgres</productname>. -->

    PL/Perlを使うと、あたかも<productname>Postgres</productname>に組み込まれているかのようにPerlプログラミング言語を使ったSQL問い合わせ関数の作成を行うことができます。

 </para>


 <para>
<!--
  The PL/Perl intepreter is a full Perl interpreter. However, certain
  operations have been disabled in order to maintain the security of
  the system.  In general, the operations that are restricted are
  those that interact with the environment. This includes filehandle
  operations, <literal>require</literal>, and <literal>use</literal>
  (for external modules).  It should be noted that this security is
  not absolute. Indeed, several Denial-of-Service attacks are still
  possible - memory exhaustion and endless loops are two examples.
--> 
    PL/Perlインタープリタは、完全なPerlインタープリタです。しかしながら、システムのセキュリティレベルを確保するために、使用できないようにしている機能もあります。一般に、これらの制限されている操作は環境と互いに影響し合っています。例としては、ファイルハンドルの操作、<literal>require</literal>、<literal>use</literal>（外部モジュール用）などがあります。このセキュリティが絶対ではないことは知っておくべきでしょう。実際に、いくつかのDoS攻撃（Denial-of-Service：サービス停止攻撃）は現状でも可能です（メモリ浪費とエンドレスループの2つの例）。
 </para>

 <sect1 id="plperl-install">
<!-- <title>Building and Installing</title> -->
  <title>ビルドとインストール</title>
<indexterm><primary>PL/Perl</primary><secondary sortas="いんすとーる">インストール</secondary></indexterm>
  <para>
<!--
   In order to build and install PL/Perl if you are installing
   <productname>Postgres</productname> from source then the
   <option>with-perl</option> must be supplied to the
   <filename>configure</filename> script.  PL/Perl requires that, when
   <productname>Perl</productname> was installed, the
   <filename>libperl</filename> library was build as a shared object.
   At the time of this writing, this is almost never the case in the
   Perl packages that are distributed with the operating systems.  A
   message like this will appear during the build to point out this
   fact:
-->
<productname>Postgres</productname>のソースからPL/Perlをインストールする場合は、<filename>configure</filename>スクリプトに<option>--with-perl</option>オプションを付けなければいけません。PL/Perlでは、<productname>Perl</productname>の<filename>libperl</filename>ライブラリが共有オブジェクトとしてビルドされている必要があります。現時点では、OSにあらかじめめ備わっているPerlパッケージのほとんどは、このようになっていません。そこで、次のようなメッセージがビルドするときに表示されることがあります。
</para>

<screen>
<computeroutput>
*****
* Cannot build PL/Perl because libperl is not a shared library.
* Skipped.
*****
</computeroutput>
</screen>

<para>
<!--
   Therefore it is likely that you will have to re-build and install
   <productname>Perl</productname> manually to be able to build
   PL/Perl.
-->
したがって多くの場合、PL/Perlを構築するために、Perlを再度手動でビルドし、インストールしなければいけません。
  </para>

  <para>
<!--
   When you want to retry to build PL/Perl after having reinstalled
   Perl, then change to the directory
   <filename>src/pl/plperl</filename> in the
   <productname>Postgres</productname> source tree and issue the commands
-->
   Perlを再インストールした後に、PL/Perlを再度ビルドする場合は、<productname>Postgres</productname>ソースツリーの<filename>src/pl/plperl</filename>ディレクトリに移動して、次のコマンドを実行します。
</para>

<programlisting>
gmake clean
gmake all
gmake install
</programlisting>

  <para>
<!--
   The <command>createlang</command> command is used to install the
   language into a database.
-->
   <command>createlang</command>コマンドは、データベースに言語を導入するために使います。
</para>

<screen>
<prompt>$</prompt> <userinput>createlang plperl template1</userinput>
</screen>

<para>
<!--
   If it is installed into template1, all future databases will have
   the language installed automatically.
-->
template1へインストールすると、その後に作成されるすべてのデータベースにはその言語が自動的にインストールされます。
  </para>
 </sect1>

 <sect1 id="plperl-use">
<!--  <title>Using PL/Perl</title> -->
  <title>PL/Perlの使用</title>

  <para>
<!--
   Assume you have the following table:
-->
   以下のテーブルが存在するとします。
</para>

<programlisting>
CREATE TABLE EMPLOYEE (
    name text,
    basesalary integer,
    bonus integer
);
</programlisting>

<para>
<!--
   In order to get the total compensation (base + bonus) we could
   define a function as follows:
-->
    給与合計（基本給＋ボーナス）を取得するために、以下のような関数を定義することができます。
</para>

<programlisting>
CREATE FUNCTION totalcomp(integer, integer) RETURNS integer
    AS 'return $_[0] + $_[1]'
    LANGUAGE 'plperl';
</programlisting>

<para>
<!--
   Notice that the arguments to the function are passed in
   <varname>@_</varname> as might be expected.
-->
    これらの引数は関数に対して期待されるように、<literal>@_</literal>で渡されることに注目してください。
  </para>

  <para>
<!--
   We can now use our function like so:
-->
  作成した関数は、次のようにして使えます。
</para>

<programlisting>
SELECT name, totalcomp(basesalary, bonus) FROM employee;
</programlisting>

  <para>
<!--
   But, we can also pass entire tuples to our functions:
-->
  またここで、PL/Perl関数にタプル全体を渡すこともできます。
</para>

<programlisting>
CREATE FUNCTION empcomp(employee) RETURNS integer AS '
    my $emp = shift;
    return $emp->{''basesalary''} + $emp->{''bonus''};
' LANGUAGE 'plperl';
</programlisting>

<para>
<!--
   A tuple is passed as a reference to a hash. The keys are the names
   of the fields in the tuples. The hash values are values of the
   corresponding fields in the tuple.
-->
    1つのタプルは、ハッシュへのリファレンスとして渡されます。キーはタプルのフィールド名です。値は、タプルの中の対応するフィールドの値になります。
  </para>

  <tip>
   <para>
<!--
    Because the function body is passed as an SQL string literal to
    <command>CREATE FUNCTION</command> you have to escape single
    quotes within your Perl source, either by doubling them as shown
    above, or by using the extended quoting functions
    (<literal>q[]</literal>, <literal>qq[]</literal>,
    <literal>qw[]</literal>).  Backslashes must be escaped by doubling
    them.
-->
    関数本体が<command>CREATE FUNCTION</command>へのSQL文字列リテラルとして渡されるので、Perlソース内の一重引用符は、上記のように二重に書くか、あるいは、引用符を付ける関数（<literal>q[]</literal>、<literal>qq[]</literal>、<literal>qw[]</literal>）を使う必要があります。バックスラッシュは二重にしてエスケープしなければいけません。
   </para>
  </tip>

  <para>
<!--
   The new function <function>empcomp</function> can used like:
-->
   新規の関数<function>empcomp</function>は、次のように使えます。
</para>

<programlisting>
SELECT name, empcomp(employee) FROM employee;
</programlisting>

  <para>
<!--
   Here is an example of a function that will not work because file
   system operations are not allowed for security reasons:
-->
   次のような関数は、セキュリティ上の理由からファイルシステム操作は許していないため、動かすことができません。
</para>

<programlisting>
CREATE FUNCTION badfunc() RETURNS integer AS '
    open(TEMP, ">/tmp/badfile");
    print TEMP "Gotcha!&bsol;n";
    return 1;
' LANGUAGE 'plperl';
</programlisting>

<para>
<!--
   The creation of the function will succeed, but executing it will not.
-->
   関数を作ることはできますが、実行することはできません。
  </para>

 </sect1>
</chapter>

<!-- 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:
-->
