43.1. PL/Perl �����Ͳ���

Ҫ�� PL/Perl ���Դ���һ����������ʹ�ñ�׼�� CREATE FUNCTION�﷨��

CREATE FUNCTION funcname (argument-types) RETURNS return-type AS $$
    # PL/Perl ������
$$ LANGUAGE plperl;

���������������ͨ�� Perl ���롣��ʵ�ϣ�PL/Perl ��ճ�ϴ������� ������һ�� Perl �ӳ����С�һ�� PL/Perl ��������һ�ֱ����������� �����ã�������޷������б�������������������ͨ���������������� �DZ���ֵ�����顢��¼�ͼ��ϣ���

PL/Perl Ҳ֧����DO�����õ���������飺

DO $$
    # PL/Perl ����
$$ LANGUAGE plperl;

һ�����������û�в��������������ص��κ�ֵ���ᱻ���������� ����Ϊ����һ��������

ע��: �� Perl ��ʹ������Ƕ���ӳ�������Σ�յģ��ر��ǵ��������������� ���þֲ�����ʱ����Ϊ PL/Perl ��������װ��һ���ӳ����κη��� ���е������ӳ��򶼻ᱻǶ�ס���֮������ͨ�� coderef ���õ����� �ӳ���Ҫ��ȫ�öࡣ������Ϣ�ɼ� perldiag�ֲ�ҳ �е�Variable "%s" will not stay shared�Լ� Variable "%s" is not available�������ڻ������� ����"perl nested named subroutine"��

The syntax of the CREATE FUNCTION������﷨Ҫ���� �屻д��һ���ַ���������ͨ�����ַ�������ʹ����Ԫ���ã��� �� 4.1.2.4 ������㡣���ѡ��ʹ�� ת���ַ����﷨E''������˫д�κ��ں�������ʹ�õĵ����� ��'���ͷ�б�ߣ�\������ �� 4.1.2.1 ������

�����ͽ���Ĵ��������κ����� Perl �ӳ�����һ�������������ݵ� @_�У����ҽ��ֵ��return ���ػ��߰Ѻ����м�������һ������ʽ��Ϊ���ֵ��

���磬һ��������������ֵ�нϴ�ֵ�ĺ������Զ���Ϊ��

CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
    if ($_[0] > $_[1]) { return $_[0]; }
    return $_[1];
$$ LANGUAGE plperl;

ע��: �������������ݿ�ı���ת���� PL/Perl ��ʹ�õ� UTF-8������ʱ�ٴ� UTF-8 ת�ص����ݿ���롣

���һ�� SQL ��ֵ������һ���������� Perl �иò���ֵ������Ϊ"undefined"����������������� ���������Ϊ��̫�ã�ʵ���ϣ���������ǵ����㣩�����ǿ���Ϊ���� ��������STRICT��PostgreSQL �ɵø������������ֵ�����룬�������������ᱻ���ã���ֻ���Զ� ����һ���ս��������һ�ַ�ʽ�����ǿ����ں������м��δ����� ���롣���磬�����������ô���һ���ղ�������һ���ǿղ����� perl_max���طǿղ��������ǿ�ֵ��

CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
    my ($x, $y) = @_;
    if (not defined $x) {
        return undef if not defined $y;
        return $y;
    }
    return $x if not defined $y;
    return $x if $x > $y;
    return $y;
$$ LANGUAGE plperl;

����������Ҫ��һ�� PL/Perl ��������һ�� SQL ��ֵ���ͷ���һ��δ����ֵ�� ���ܺ������ϸ�Ļ��Ƿ��ϸ�Ķ�������������

һ�������õĺ��������е��κζ�������һ������������������͵ı�׼ PostgreSQL�ⲿ�ı��������ͨ ���ֻ��ı����͵�����£�Perl ��������ȷ�����鲢�ҳ���Աͨ������Ҫ ���ġ�����������������½���Ҫ��ת������ Perl �и����õ���ʽ�����磬 decode_bytea�������Ա����������� bytea�IJ���ת����δת��Ķ�������ʽ��

���Ƶأ��ش���PostgreSQL��ֵ���� ���ⲿ�ı������ʽ�����磬encode_bytea �������Ա�����ת����������ݵõ�����bytea�ķ���ֵ��

Perl ���԰�PostgreSQL���鷵��Ϊ�� Perl ��������á�������һ�����ӣ�

CREATE OR REPLACE function returns_array()
RETURNS text[][] AS $$
    return [['a"b','c,d'],['e\\f','g']];
$$ LANGUAGE plperl;

select returns_array();

Perl ��PostgreSQL������Ϊ�� bless ���� PostgreSQL::InServer::ARRAY���󴫵ݡ����������Ա����� һ���������û���һ����������Ϊ������������Ϊ 9.1 ���°汾�� PostgreSQL��д�� Perl ����һ�����С� ���磺

CREATE OR REPLACE FUNCTION concat_array_elements(text[]) RETURNS TEXT AS $$
    my $arg = shift;
    my $result = "";
    return undef if (!defined $arg);

    # as an array reference
    for (@$arg) {
        $result .= $_;
    }

    # also works as a string
    $result .= $arg;

    return $result;
$$ LANGUAGE plperl;

SELECT concat_array_elements(ARRAY['PL','/','Perl']);

ע��: ��ά���鱻��һ�ֶ�ÿһ�� Perl ����Ա�����ϵķ�����ʾΪ�Խϵ�ά�������� �����á�

������Ͳ�������Ϊ��ϣ�����ô��ݸ���������ϣ�ļ���������͵� ��������������һ�����ӣ�

CREATE TABLE employee (
    name text,
    basesalary integer,
    bonus integer
);

CREATE FUNCTION empcomp(employee) RETURNS integer AS $$
    my ($emp) = @_;
    return $emp->{basesalary} + $emp->{bonus};
$$ LANGUAGE plperl;

SELECT name, empcomp(employee.*) FROM employee;

PL/Perl ��������ʹ����ͬ�ķ�������������ͣ����ؾ�����Ҫ�����Ե� ��ϣ�����á����磺

CREATE TYPE testrowperl AS (f1 integer, f2 text, f3 text);

CREATE OR REPLACE FUNCTION perl_row() RETURNS testrowperl AS $$
    return {f2 => 'hello', f1 => 1, f3 => 'world'};
$$ LANGUAGE plperl;

SELECT * FROM perl_row();

�κ���Ҫ�������������в������ڹ�ϣ�е��н�������Ϊ��ֵ��

PL/Perl ����Ҳ�ܷ��ر�������������ͼ��ϡ�Ϊ�˼����������ұ����� �ڴ���������������ŶӵȺ�����ͨ��ϣ����һ�η���һ�С����԰� ������˵����return_next����������ע���� ���һ��return_next�󣬱������ return����return undef�����߸��ã���

CREATE OR REPLACE FUNCTION perl_set_int(int)
RETURNS SETOF INTEGER AS $$
    foreach (0..$_[0]) {
        return_next($_);
    }
    return undef;
$$ LANGUAGE plperl;

SELECT * FROM perl_set_int(5);

CREATE OR REPLACE FUNCTION perl_set()
RETURNS SETOF testrowperl AS $$
    return_next({ f1 => 1, f2 => 'Hello', f3 => 'World' });
    return_next({ f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' });
    return_next({ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' });
    return undef;
$$ LANGUAGE plperl;

����С����������Է��ص�һ����������ã�������ֱ�������� �����͡��������ͺ�������͵ı������������û��߹�ϣ���á� ������һЩ�򵥵����Ӱ������������Ϊ�������÷��أ�

CREATE OR REPLACE FUNCTION perl_set_int(int) RETURNS SETOF INTEGER AS $$
    return [0..$_[0]];
$$ LANGUAGE plperl;

SELECT * FROM perl_set_int(5);

CREATE OR REPLACE FUNCTION perl_set() RETURNS SETOF testrowperl AS $$
    return [
        { f1 => 1, f2 => 'Hello', f3 => 'World' },
        { f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' },
        { f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' }
    ];
$$ LANGUAGE plperl;

SELECT * FROM perl_set();

�������Ҫ����Ĵ���ʹ��strict����ָʾ���м���ѡ����á� ������ʱ��ȫ��ʹ�ã������SET plperl.use_strictΪ�档�⽫Ӱ����� PL/Perl�����ı��룬���ǶԵ�ǰ�Ự���Ѿ�������� ����û��Ӱ�졣���ڳ־õ�ȫ��ʹ�ã������� postgresql.conf�ļ������� plperl.use_strictΪ�档

�������ض������еij־�ʹ�ã����Լ򵥵ذ�

use strict;

���ں�����Ķ��㡣

��� Perl �汾�� 5.10.0 ���߸��ߣ�Ҳ����ʹ�� feature����ָʾ��