¾�ΥС�������ʸ�� �� 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

39.3. ���

�֥��å���ǻ��Ѥ�������Ƥ��ѿ��Ϥ��Υ֥��å�����������������ʤ���Фʤ�ޤ��� ��ͣ����㳰�ϡ�FOR�롼�פǤ��������ͤ��ϰϤ��ϤäƷ����֤����롼���ѿ��ǡ�����ϡ���ưŪ���������ѿ��Ȥ����������ޤ��� Ʊ�ͤˡ���������η�̤��Ф��Ʒ����֤�Ŭ�Ѥ����FOR�롼�פΥ롼���ѿ��ϥ쥳�����ѿ��Ȥ��Ƽ�ưŪ���������ޤ�����

PL/pgSQL�ѿ��ϡ�integer��varchar��char�Ȥ��ä���Ǥ�դ�SQL�ǡ���������Ĥ��Ȥ��Ǥ��ޤ���

�ѿ���������ʲ��˼����ޤ���

user_id integer;
quantity numeric(5);
url varchar;
myrow tablename%ROWTYPE;
myfield tablename.columnname%TYPE;
arow RECORD;

�ѿ�����ΰ���Ū�ʹ�ʸ�ϰʲ����̤�Ǥ���

name [ CONSTANT ] type [ COLLATE collation_name ] [ NOT NULL ] [ { DEFAULT | := } expression ];

DEFAULT�礬���ꤵ�줿��硢�֥��å������ä������ѿ���������������ͤ���ꤷ�ޤ��� DEFAULT�礬���ꤵ��ʤ���硢�ѿ���SQL��NULL�ͤ˽��������ޤ��� CONSTANT���ץ����ˤ�ꡢ���Υ֥��å���Ǥ����ͤ����Ѥˤʤ�褦�ˡ������ѿ��ؤν������������϶ػߤ���ޤ��� COLLATE���ץ����ϡ��ѿ��Ȥ��ƻ��Ѥ��뤿��ξȹ����ꤷ�ޤ���項39.3.6�򻲾Ȥ��Ƥ��������ˡ� NOT NULL�����ꤵ�줿��硢NULL�ͤ������ϼ¹Ի����顼�ˤʤ�ޤ��� NOT NULL�Ȥ�����������ѿ������ơ���NULL�Υǥե�����ͤ���ꤷ�ʤ���Фʤ�ޤ���

�ѿ��Υǥե�����ͤϥ֥��å��������٤�ɾ�����졢�ѿ�����������ޤ��ʴؿ���ƤӽФ����˰��٤����ǤϤ���ޤ���ˡ� �Ǥ����顢�㤨��now()��timestamp�����ѿ����������뤳�Ȥǡ������ѿ��ˤϴؿ���ץꥳ��ѥ��뤷������ǤϤʤ����ؿ��ƤӽФ����θ��߻��郎��Ǽ����ޤ���

�㡧

quantity integer DEFAULT 32;
url varchar := 'http://mysite.com';
user_id CONSTANT integer := 10;

39.3.1. �ؿ����������

�ؿ����Ϥ����ѥ�᡼����̾���ˤ�$1��$2�Ȥ������̻Ҥ��դ����ޤ��� ��ά���뤳�Ȥ�Ǥ��ޤ�����$n�Ȥ����ѥ�᡼��̾����̾��������뤳�Ȥ��Ǥ��������������夷�ޤ��� ��̾�������ˤ�뼱�̻Ҥ�ξ���Ȥ�������ͤ򻲾Ȥ�����˻��Ѥ��뤳�Ȥ��Ǥ��ޤ���

��̾�����������ˡ��2�Ĥ��ꡢ˾�ޤ�����ˡ��CREATE FUNCTION���ޥ�ɤ���ǥѥ�᡼����̿̾�����ΤǤ��� �ʲ�����򼨤��ޤ���

CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$
BEGIN
    RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;

¾����ˡ�ϡ������ʸ���Ѥ�����̾�����Τ���������ΤǤ��� ����� PostgreSQL 8.0������Ǥϡ�ͣ�����ˡ�Ǥ���

name ALIAS FOR $n;

�ʲ��ˤ�����ˡ�ˤ����򼨤��ޤ���

CREATE FUNCTION sales_tax(real) RETURNS real AS $$
DECLARE
    subtotal ALIAS FOR $1;
BEGIN
    RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;

注意: ��������ϴ�����Ʊ���ǤϤ���ޤ��� �ǽ����Ǥϡ�subtotal��sales_tax.subtotal�ǻ��ȤǤ��ޤ�����������ǤϤǤ��ޤ��� �ʤ������ꡢ�����֥��å��˥�٥����Ϳ����С�subtotal���٥�ǽ������뤳�Ȥ��Ǥ��ޤ��ˡ�

����˿���򼨤��ޤ���

CREATE FUNCTION instr(varchar, integer) RETURNS integer AS $$
DECLARE
    v_string ALIAS FOR $1;
    index ALIAS FOR $2;
BEGIN
    -- v_string �ȥ���ǥå�������Ѥ������餫�α黻��Ԥʤ�
END;
$$ LANGUAGE plpgsql;


CREATE FUNCTION concat_selected_fields(in_t sometablename) RETURNS text AS $$
BEGIN
    RETURN in_t.f1 || in_t.f3 || in_t.f5 || in_t.f7;
END;
$$ LANGUAGE plpgsql;

PL/pgSQL�ؿ������ϥѥ�᡼���ȶ�����������ȡ��̾�����ϥѥ�᡼����Ʊ�ͤˡ����ϥѥ�᡼���ˤ�$n�Ȥ����ѥ�᡼��̾��Ǥ�դ���̾��Ϳ�����ޤ��� ���ϥѥ�᡼���ϼ¼�Ū�ˤϺǽ餬NULL�ͤ��ѿ��Ǥ��ꡢ�ؿ��μ¹�����ͤ����ꤵ���Ϥ��Ǥ��� ���ϥѥ�᡼���κǸ���ͤ�����ͤǤ��� �㤨�С������Ǥ�����ϡ����Τ褦�ˤ��뤳�Ȥ�Ǥ��ޤ���

CREATE FUNCTION sales_tax(subtotal real, OUT tax real) AS $$
BEGIN
    tax := subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;

RETURNS real���ά�������Ȥ����դ��Ƥ��������� �ޤ�뤳�Ȥ�Ǥ��ޤ�������Ĺ�ˤʤ�ޤ���

���ϥѥ�᡼����ʣ�����ͤ��֤����˺Ǥ�ͭ�Ѥˤʤ�ޤ��� ��ñ������򼨤��ޤ���

CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT prod int) AS $$
BEGIN
    sum := x + y;
    prod := x * y;
END;
$$ LANGUAGE plpgsql;

項35.4.4�ǽҤ٤��褦�ˡ�������ˡ�ϴؿ��η�̤��Ф���ƿ̾�Υ쥳���ɷ���¼�Ū�˺������ޤ��� RETURNS�礬Ϳ����줿���ϡ�RETURNS record�ȸ���ʤ���Фʤ�ޤ���

PL/pgSQL�ؿ����������¾����ˡ�Ȥ��ơ�RETURNS TABLE��ȼ�����Ȥ��󤲤��ޤ��� �ʲ�����򼨤��ޤ���

CREATE FUNCTION extended_sales(p_itemno int)
RETURNS TABLE(quantity int, total numeric) AS $$
BEGIN
    RETURN QUERY SELECT quantity, quantity * price FROM sales
                 WHERE itemno = p_itemno;
END;
$$ LANGUAGE plpgsql;

����ϡ����ġ��ޤ��Ϥ���ʾ��OUT�ѥ�᡼����������뤳�ȡ������RETURNS SETOF ���餫�Υǡ���������ꤹ�뤳�Ȥ����������Ǥ���

PL/pgSQL�ؿ�������ͤ�¿�ͷ���anyelement��anyarray��anynonarray�ޤ���anyenum�ˤȤ�����������ȡ����̤�$0�ѥ�᡼������������ޤ��� ���Υǡ����������ºݤ����Ϸ���������項35.2.5�򻲾ȡˤ��줿�ؿ��μºݤ�����ͷ��Ǥ��� $0��NULL�ǽ�������졢�ؿ�����ѹ����뤳�Ȥ��Ǥ��ޤ��� �Ǥ��Τǡ�ɬ�ܤǤϤ���ޤ��󤬡����������ͤ��ݻ����뤿��˻��Ѥ��Ƥ⹽���ޤ��� �ޤ�$0����̾����Ϳ���뤳�Ȥ�Ǥ��ޤ��� �㤨�С��ʲ��δؿ���+�黻�Ҥ����Ǥ�դΥǡ��������Ф��Ʋ�Ư���ޤ���

CREATE FUNCTION add_three_values(v1 anyelement, v2 anyelement, v3 anyelement)
RETURNS anyelement AS $$
DECLARE
    result ALIAS FOR $0;
BEGIN
    result := v1 + v2 + v3;
    RETURN result;
END;
$$ LANGUAGE plpgsql;

1�İʾ�ν��ϥѥ�᡼����¿�ͷ��Ȥ���������뤳�Ȥˤ�ꡢƱ�ͤη�̤����뤳�Ȥ��Ǥ��ޤ��� ���ξ�硢�ü��$0�ѥ�᡼���ϻ��Ѥ���ޤ��� ���ϥѥ�᡼�����Ȥ�Ʊ����Ū��̤����ޤ��� �ʲ�����򼨤��ޤ���

CREATE FUNCTION add_three_values(v1 anyelement, v2 anyelement, v3 anyelement,
                                 OUT sum anyelement)
AS $$
BEGIN
    sum := v1 + v2 + v3;
END;
$$ LANGUAGE plpgsql;

39.3.2. ALIAS

newname ALIAS FOR oldname;

ALIAS��ʸ������Ǽ�������Τ�����Ū�Ǥ��� �ؿ��ΰ��������ǤϤʤ���Ǥ�դ��ѿ�����̾��������뤳�Ȥ��Ǥ��ޤ��� ���θ���Ū�ʻ��Ѥϼ�ˡ��ȥꥬ�ץ���������ˤ�����NEW��OLD�ʤɡ�����äƷ�ޤä�̾�����ѿ����̤�̾���������Ƥ뤳�ȤǤ���

�ʲ�����򼨤��ޤ���

DECLARE
  prior ALIAS FOR old;
  updated ALIAS FOR new;

ALIAS��Ʊ�����֥������Ȥ�̿̾����2�Ĥΰۤʤ���ʤ��󶡤��ޤ��Τǡ�̵���¤˻��Ѥ���Ⱥ���򾷤����⤷��ޤ��� ����äƷ�ޤäƤ���̾�����񤭤�����Ū�˸��ꤷ�ƻ��Ѥ��뤳�Ȥ������Ǥ���

39.3.3. ���Υ��ԡ�

variable%TYPE

%TYPE���ѿ���ơ��֥���Υǡ��������󶡤��ޤ��� �������Ѥ��ƥǡ����١����ͤ��ݻ������ѿ���������뤳�Ȥ��Ǥ��ޤ��� �㤨�С�users�ơ��֥��user_id�Ȥ����󤬤����ΤȤ��ޤ��� users.user_id��Ʊ���ǡ��������ѿ����������ˤϡ��ʲ��Τ褦�˵��Ҥ��ޤ���

user_id users.user_id%TYPE;

%TYPE����Ѥ��뤳�Ȥǡ����Ȥ��빽¤�Υǡ��������İ�����ɬ�פ��ʤ��ʤ�ޤ��� �ޤ������줬�Ǥ���פʤ��ȤǤ��������Ȥ������ܤΥǡ������������ѹ����줿���㤨�С�user_id�Υơ��֥������integer����real���ѹ������˾��Ǥ⡢�ؿ�������ѹ�����ɬ�פ�ʤ������Ȥ��Ǥ��ޤ���

�����ѿ��ѤΥǡ������ϸƤӽФ��٤��Ѥ�뤫�⤷��ޤ���Τ�%TYPE���ä�¿�ʹؿ���ͭ�ѤǤ��� �ؿ��ΰ��������ѤΥץ졼���ۥ����%TYPE��Ŭ�Ѥ��뤳�Ȥǡ�Ŭ�ڤ��ѿ���������뤳�Ȥ��Ǥ��ޤ���

39.3.4. �Է�

name table_name%ROWTYPE;
name composite_type_name;

ʣ�緿���ѿ��ϡ����ѿ��ʤޤ����Է��ѿ��ˤȸƤФ�ޤ��� �������ä��ѿ��ˤϡ��䤤��碌���󽸹礬�ѿ��η�����Ȱ��פ���¤ꡢSELECT��FOR�䤤��碌�η�̤ι����Τ��ݻ����뤳�Ȥ��Ǥ��ޤ��� ���ѿ��θġ��Υե�������ͤˤϡ��㤨�С�rowvar.field�Ȥ��ä��ɥåȵ�ˡ����Ѥ��ƥ����������뤳�Ȥ��Ǥ��ޤ���

table_name%ROWTYPE�Ȥ�����ˡ����Ѥ��ơ���¸�Υơ��֥��ӥ塼�ιԤ�Ʊ��������Ĺ��ѿ���������뤳�Ȥ��Ǥ��ޤ��� �⤷���ϡ�ʣ�緿��̾������Ϳ����������뤳�Ȥ��Ǥ��ޤ��� �����ƤΥơ��֥�ϡ�Ʊ��̾���δ�Ϣ����ʣ�緿������ޤ��Τǡ��ºݤΤȤ���PostgreSQL�Ǥϡ�%ROWTYPE�Ƚ񤤤Ƥ�񤫤ʤ��Ƥ�����ˤϤʤ�ޤ��� ��������%ROWTYPE���������ܿ�������ޤ�ޤ�����

�ؿ��ؤΥѥ�᡼���Ȥ���ʣ�緿�ʥơ��֥�����Ρˤ��뤳�Ȥ��Ǥ��ޤ��� ���ξ�硢�б����뼱�̻�$n�Ϲ��ѿ��Ǥ��ꡢ���Υե�����ɤ��㤨�С�$1.user_id�����򤹤뤳�Ȥ��Ǥ��ޤ���

�ơ��֥�ԤΥ桼�������°���Τߤ˹Է��ѿ��ǥ����������뤳�Ȥ��Ǥ��ޤ��� OID�䤽��¾�Υ����ƥ�°���ˤϥ��������Ǥ��ޤ���ʥӥ塼����ιԤ��������뤿��Ǥ��ˡ� �Է��Υե�����ɤϡ��㤨��char(n)�ʤɤΥơ��֥�Υե�����ɤ��礭����ǡ����������٤�Ѿ����ޤ���

�ʲ���ʣ�緿����Ѥ�����򼨤��ޤ��� table1�ڤ�table2�ϡ� ���ʤ��Ȥ���ڤ���ե�����ɤ�ͭ�����¸�Υơ��֥�Ǥ���

CREATE FUNCTION merge_fields(t_row table1) RETURNS text AS $$
DECLARE
    t2_row table2%ROWTYPE;
BEGIN
    SELECT * INTO t2_row FROM table2 WHERE ... ;
    RETURN t_row.f1 || t2_row.f3 || t_row.f5 || t2_row.f7;
END;
$$ LANGUAGE plpgsql;

SELECT merge_fields(t.*) FROM table1 t WHERE ... ;

39.3.5. �쥳���ɷ�

name RECORD;

�쥳�����ѿ��ϹԷ��ѿ��Ȼ��Ƥ��ޤ�����������������줿��¤����äƤ��ޤ��� �����SELECT��FOR���ޥ�ɤδ֤��������줿�ԤμºݤιԹ�¤����ޤ��� �쥳�����ѿ�������¤�ϡ�������Ԥ��٤��ѹ��Ǥ��ޤ��� �Ĥޤꡢ�쥳�����ѿ��ϡ��ǽ�����������ޤ�����¤����������������äơ��ե�����ɤؤΥ����������ߤ�ȼ¹Ի����顼��ȯ�����ޤ���

RECORD�������Υǡ������ǤϤʤ���ñ�ʤ�ץ졼���ۥ���Ǥ��뤳�Ȥ����դ��Ƥ��������� PL/pgSQL�ؿ���record�����֤��������δؿ��Ǥϥ쥳�����ѿ�����Ѥ��Ƥ��η�̤��ݻ����뤳�Ȥ��Ǥ��ޤ���������ϥ쥳�����ѿ��Ȥ��Ƥγ�ǰ�ȤϤޤä����ۤʤ뤳�Ȥ�ǧ�����٤��Ǥ��� ξ���Ȥ⡢�ؿ��κ����ʳ��ǤϼºݤιԹ�¤�������Ǥ��� ���������쥳�����ѿ��Ϥ��ξ줽�ξ�Ǥ��ιԹ�¤���ѹ��Ǥ���ˤ⤫����餺��record���֤��ؿ��ǤϸƤӽФ������䤤��碌�����Ϥ��줿�����Ǽºݤι�¤�Ϸ��ꤵ��ޤ���

39.3.6. PL/pgSQL�ѿ��ξȹ�

PL/pgSQL�ؿ����ȹ��ǽ�ʥǡ������Υѥ�᡼���� 1�İʾ���ͭ�����硢項22.2�˵��Ҥ����褦�ˡ��ºݤΰ����˳�����Ƥ�줿�ȹ�˽��äơ��ؿ��ƤӽФ���˾ȹ礬���̤���ޤ��� �ȹ�μ��̤������������ʤ��ʤ���������δ֤˻��¾�ξȹ�ˤ�������ͤ��ʤ����ˡ��ȹ��ǽ�����ƤΥѥ�᡼���ϻ��¾�ξȹ��ͭ����Ȥ��ư����ޤ��� ����ϴؿ������ˤ����ơ��ȹ�˰�¸�������κ��Ѥ˱ƶ����ޤ��� �ʲ������ͤ��Ƥ���������

CREATE FUNCTION less_than(a text, b text) RETURNS boolean AS $$
BEGIN
    RETURN a < b;
END;
$$ LANGUAGE plpgsql;

SELECT less_than(text_field_1, text_field_2) FROM table1;
SELECT less_than(text_field_1, text_field_2 COLLATE "C") FROM table1;

���λ���ˡ�ˤ�����less_than�ϡ�text_field_1��text_field_2����ӤΤ�����̾�ξȹ�Ȥ����Ѥ����ޤ��� ����λ���ˡ�ˤ����Ƥϡ�C�ȹ�Ȥ����Ѥ����ޤ���

����ˡ����̤��줿�ȹ�ϡ��ȹ��ǽ�ʥǡ����������Ƥζɽ��ѿ��ξȹ�Ȥ��ƤⲾ�ꤵ��ޤ��� �������äơ����δؿ��ϲ��˵��Ҥ���ؿ��Ⱥ��ۤʤ���ư���ޤ���

CREATE FUNCTION less_than(a text, b text) RETURNS boolean AS $$
DECLARE
    local_a text := a;
    local_b text := b;
BEGIN
    RETURN local_a < local_b;
END;
$$ LANGUAGE plpgsql;

�ȹ��ǽ�ʥǡ������Υѥ�᡼����¸�ߤ��ʤ���硢�ޤ��ϡ������Ƕ��̤���ȹ������̤Ǥ��ʤ���硢�ѥ�᡼���ȶɽ��ѿ��ϼ��ȤΥǡ������Υǥե���Ȥξȹ������̾盧��ϥǡ����١����Υǥե���Ȥξȹ����Ǥ������ɥᥤ�󷿤��ѿ��ξ��ϰۤʤ뤫�⤷��ޤ���ˤ���Ѥ��ޤ���

�ȹ��ǽ�ʥǡ������ζɽ��ѿ��ϡ�������COLLATE���ץ�����ޤ�뤳�Ȥˤ�ꡢ�̤ξȹ�ȴ�Ϣ�Ť��뤳�Ȥ��Ǥ��ޤ��� ��򼨤��ޤ���

DECLARE
    local_a text COLLATE "en_US";

���Υ��ץ����Ͼ嵭�롼��ˤ�ꡢ�ѿ���¾����ˡ����Ϳ�����Ϥ��Ǥ��ä��ȹ���񤭤��ޤ���

�ޤ������ʤ��顢����Ū����������ˤ���������ξȹ�������Ѥ�������硢����Ū��COLLATE���ؿ������˵��Ҥ��뤳�Ȥ��Ǥ��ޤ��� ��򼨤��ޤ���

CREATE FUNCTION less_than_c(a text, b text) RETURNS boolean AS $$
BEGIN
    RETURN a < b COLLATE "C";
END;
$$ LANGUAGE plpgsql;

ñ��� SQL ���ޥ�ɤǵ�����褦�ˡ�����ϥơ��֥���󡢥ѥ�᡼�����ޤ��ϼ�����ζɽ��ѿ��˴�Ϣ�Ť���줿�ȹ���񤭤��ޤ�