⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 create_language.sgml

📁 关系型数据库 Postgresql 6.5.2
💻 SGML
字号:
<refentry id="SQL-CREATELANGUAGE"> <refmeta>  <refentrytitle>   CREATE LANGUAGE  </refentrytitle>  <refmiscinfo>SQL - Language Statements</refmiscinfo> </refmeta> <refnamediv>  <refname>   CREATE LANGUAGE  </refname>  <refpurpose>   Defines a new language for functions  </refpurpose> </refnamediv> <refsynopsisdiv>  <refsynopsisdivinfo>   <date>1998-09-09</date>  </refsynopsisdivinfo>  <synopsis>CREATE [ TRUSTED ] PROCEDURAL LANGUAGE '<replaceable class="parameter">langname</replaceable>'    HANDLER <replaceable class="parameter">call_handler</replaceable>    LANCOMPILER '<replaceable class="parameter">comment</replaceable>'  </synopsis>    <refsect2 id="R2-SQL-CREATELANGUAGE-1">   <refsect2info>    <date>1998-09-09</date>   </refsect2info>   <title>    Inputs   </title>   <para>    <variablelist>     <varlistentry>      <term>TRUSTED</term>      <listitem>       <para>	<function> TRUSTED</function> specifies that the call handler for	the language is safe; that is, it offers an unprivileged user	no functionality to bypass access restrictions. If	this keyword is omitted when registering the language,	only users with the <productname>Postgres</productname>	superuser privilege can use	this language to create new functions	(like the 'C' language).         </para>      </listitem>     </varlistentry>     <varlistentry>      <term><replaceable class="parameter">langname</replaceable></term>      <listitem>       <para>   	The name of the new procedural language.	The language name is case insensitive. A procedural 	language cannot override one of the built-in languages of	<productname>Postgres</productname>.       </para>      </listitem>     </varlistentry>      <varlistentry>      <term>HANDLER <replaceable class="parameter">call_handler</replaceable></term>      <listitem>       <para>	<replaceable class="parameter">call_handler</replaceable> is the name	of a previously	registered function that will be called to execute the PL	procedures.       </para>      </listitem>     </varlistentry>     <varlistentry>      <term><replaceable class="parameter">comment</replaceable></term>      <listitem>       <para>	The <function>LANCOMPILER</function> argument is the	string that will be	inserted in the <literal>LANCOMPILER</literal> attribute	of the new	<filename>pg_language</filename> entry. At present,	<productname>Postgres</productname> does not use	this attribute in any way.       </para>      </listitem>     </varlistentry>    </variablelist>   </para>     </refsect2>    <refsect2 id="R2-SQL-CREATELANGUAGE-2">   <refsect2info>    <date>1998-09-09</date>   </refsect2info>   <title>    Outputs   </title>   <para>    <variablelist>     <varlistentry>      <term><computeroutput>CREATE       </computeroutput></term>      <listitem>       <para>	This message is returned if the language is successfully	created.       </para>      </listitem>     </varlistentry>     <varlistentry>      <term><computeroutput>ERROR:  PL handler function <replaceable class="parameter">funcname</replaceable>() doesn't exist       </computeroutput></term>      <listitem>       <para>	This error is returned if the function	<replaceable class="parameter">funcname</replaceable>()	is not found.       </para>      </listitem>     </varlistentry>    </variablelist>   </para>  </refsect2> </refsynopsisdiv> <refsect1 id="R1-SQL-CREATELANGUAGE-1">  <refsect1info>   <date>1998-09-09</date>  </refsect1info>  <title>   Description  </title>  <para>   Using <command>CREATE LANGUAGE</command>, a    <productname>Postgres</productname> user can register   a new language with <productname>Postgres</productname>.    Subsequently, functions and   trigger procedures can be defined in this new language.   The user must have the <productname>Postgres</productname>   superuser privilege to   register a new language.  </para>  <refsect2 id="R2-SQL-CREATELANGUAGE-3">   <refsect2info>    <date>1998-09-09</date>   </refsect2info>   <title>    Writing PL handlers   </title>   <para>    The call handler for a procedural language must be written    in a compiler language such as 'C' and registered with    <productname>Postgres</productname> as a function taking    no arguments and returning the    <type>opaque</type> type, a placeholder for unspecified or undefined types..    This prevents the call handler from being    called directly as a function from queries.   </para>   <para>    However, arguments must be supplied on the actual call when a    PL function or trigger    procedure in the language offered by the handler is to be    executed.    <itemizedlist>     <listitem>      <para>       When called from the trigger manager, the only argument is       the object ID from the procedure's <filename>pg_proc</filename>       entry. All other       information from the trigger manager is found in the       global <structname>CurrentTriggerData</structname> pointer.      </para>     </listitem>     <listitem>      <para>       When called from the function manager, the arguments are       the object ID of the procedure's <filename>pg_proc</filename>       entry, the number       of arguments given to the PL function, the arguments in a       <structname>FmgrValues</structname> structure and a pointer       to a boolean where the       function tells the caller if the return value is the SQL       NULL value.      </para>     </listitem>    </itemizedlist>   </para>   <para>    It's up to the call handler to fetch the    <filename>pg_proc</filename> entry and    to analyze the argument and return types of the called    procedure. The AS clause from the    <command>CREATE FUNCTION</command> of    the procedure will be found in the <literal>prosrc</literal>    attribute of the    <filename>pg_proc</filename> table entry. This may be the    source text in the procedural    language itself (like for PL/Tcl), a pathname to a    file or anything else that tells the call handler what to    do in detail.   </para>  </refsect2>     <refsect2 id="R2-SQL-CREATELANGUAGE-4">   <refsect2info>    <date>1998-09-09</date>   </refsect2info>   <title>    Notes   </title>   <para>    Use <command>CREATE FUNCTION</command>    to create a function.   </para>   <para>    Use <command>DROP LANGUAGE</command>  to drop procedural languages.   </para>   <para>    Refer to the table <filename>pg_language</filename>    for further information:    <programlisting>     <computeroutput>Table    = pg_language+--------------------------+--------------------------+-------+|          Field           |          Type            | Length|+--------------------------+--------------------------+-------+| lanname                  | name                     |    32 || lancompiler              | text                     |   var |+--------------------------+--------------------------+-------+lanname |lancompiler   --------+--------------internal|n/a           lisp    |/usr/ucb/lisztC       |/bin/cc       sql     |postgres     </computeroutput>    </programlisting>   </para>  </refsect2> </refsect1> <refsect1 id="R1-SQL-CREATELANGUAGE-4">  <title>   Restrictions  </title>  <para>   Since the call handler for a procedural language must be   registered with <productname>Postgres</productname> in the 'C' language,   it inherits   all the capabilities and restrictions of 'C' functions.  </para> </refsect1> <refsect1 id="R1-SQL-CREATELANGUAGE-5">  <title>   Bugs  </title>  <para>    At present, the definitions for a procedural language cannot be   changed once they have been created.  </para> </refsect1>  <refsect1 id="R1-SQL-CREATELANGUAGE-6">  <title>   Usage  </title>  <para>   This is a template for a PL handler written in 'C':   <programlisting>#include "executor/spi.h"#include "commands/trigger.h"#include "utils/elog.h"#include "fmgr.h"        /* for FmgrValues struct */#include "access/heapam.h"#include "utils/syscache.h"#include "catalog/pg_proc.h"#include "catalog/pg_type.h"Datumplsample_call_handler(     Oid       prooid,     int       pronargs,     FmgrValues     *proargs,     bool      *isNull){     Datum          retval;     TriggerData    *trigdata;     if (CurrentTriggerData == NULL) {          /*           * Called as a function           */          retval = ...     } else {          /*           * Called as a trigger procedure           */          trigdata = CurrentTriggerData;          CurrentTriggerData = NULL;          retval = ...     }     *isNull = false;     return retval;}   </programlisting>  </para>  <para>   Only a few thousand lines of code have to be added instead   of the dots to complete the PL call handler.    See <command>CREATE FUNCTION</command> for information on how to compile   it into a loadable module.  </para>  <para>   The following commands then register the sample procedural   language:   <programlisting>CREATE FUNCTION plsample_call_handler () RETURNS opaque    AS '/usr/local/pgsql/lib/plsample.so'    LANGUAGE 'C';CREATE PROCEDURAL LANGUAGE 'plsample'    HANDLER plsample_call_handler    LANCOMPILER 'PL/Sample';   </programlisting>  </para> </refsect1> <refsect1 id="R1-SQL-CREATELANGUAGE-7">  <title>   Compatibility  </title>  <para>   CREATE LANGUAGE is a <productname>Postgres</productname> extension.  </para>  <refsect2 id="R2-SQL-CREATELANGUAGE-5">   <refsect2info>    <date>1998-09-09</date>   </refsect2info>   <title>    SQL92   </title>   <para>    There is no <command>CREATE LANGUAGE</command> statement in    <acronym>SQL92</acronym>.   </para>  </refsect2> </refsect1></refentry><!-- Keep this comment at the end of the fileLocal variables:mode: sgmlsgml-omittag:nilsgml-shorttag:tsgml-minimize-attributes:nilsgml-always-quote-attributes:tsgml-indent-step:1sgml-indent-data:tsgml-parent-document:nilsgml-default-dtd-file:"../reference.ced"sgml-exposed-tags:nilsgml-local-catalogs:"/usr/lib/sgml/catalog"sgml-local-ecat-files:nilEnd:-->

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -