PostgreSQL 9.1.5ʸ�� | ||||
---|---|---|---|---|
前のページ | 巻戻し | 第 39章PL/pgSQL - SQL��³������ | 早送り | 次のページ |
�֥��å���ǻ��Ѥ�������Ƥ��ѿ��Ϥ��Υ֥��å�����������������ʤ���Фʤ�ޤ��� ��ͣ����㳰�ϡ�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;
�ؿ����Ϥ����ѥ�����̾���ˤ�$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;
newname ALIAS FOR oldname;
ALIAS��ʸ������Ǽ�������Τ�����Ū�Ǥ��� �ؿ��ΰ��������ǤϤʤ���Ǥ�դ��ѿ�����̾��������뤳�Ȥ��Ǥ��ޤ��� ���θ���Ū�ʻ��Ѥϼ�ˡ��ȥꥬ�ץ���������ˤ�����NEW��OLD�ʤɡ�����äƷ�ޤä�̾�����ѿ����̤�̾���������Ƥ뤳�ȤǤ���
�ʲ�������ޤ���
DECLARE prior ALIAS FOR old; updated ALIAS FOR new;
ALIAS��Ʊ�����֥������Ȥ�̿̾����2�Ĥΰۤʤ���ʤ����ޤ��Τǡ�̵���¤˻��Ѥ���Ⱥ�������⤷��ޤ��� ����äƷ�ޤäƤ���̾����������Ū�˸��ꤷ�ƻ��Ѥ��뤳�Ȥ������Ǥ���
variable%TYPE
%TYPE���ѿ���ơ��֥���Υǡ����������ޤ��� �������Ѥ��ƥǡ����١����ͤ��ݻ������ѿ���������뤳�Ȥ��Ǥ��ޤ��� �㤨�С�users�ơ��֥��user_id�Ȥ��������ΤȤ��ޤ��� users.user_id��Ʊ���ǡ��������ѿ����������ˤϡ��ʲ��Τ褦�˵��Ҥ��ޤ���
user_id users.user_id%TYPE;
%TYPE����Ѥ��뤳�Ȥǡ����Ȥ��빽¤�Υǡ��������İ�����ɬ�פ��ʤ��ʤ�ޤ��� �ޤ������줬�Ǥ���פʤ��ȤǤ��������Ȥ������ܤΥǡ������������ѹ����줿���㤨�С�user_id�Υơ��֥������integer����real���ѹ������˾��Ǥ⡢�ؿ�������ѹ�����ɬ�פ�ʤ������Ȥ��Ǥ��ޤ���
�����ѿ��ѤΥǡ������ϸƤӽФ��٤��Ѥ�뤫�⤷��ޤ���Τ�%TYPE���ä�¿�ʹؿ���ͭ�ѤǤ��� �ؿ��ΰ��������ѤΥץ졼���ۥ����%TYPE��Ŭ�Ѥ��뤳�Ȥǡ�Ŭ�ڤ��ѿ���������뤳�Ȥ��Ǥ��ޤ���
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 ... ;
name RECORD;
�쥳�����ѿ��ϹԷ��ѿ��Ȼ��Ƥ��ޤ�����������������줿��¤����äƤ��ޤ��� �����SELECT��FOR���ޥ�ɤδ֤��������줿�ԤμºݤιԹ�¤����ޤ��� �쥳�����ѿ�������¤�ϡ�������Ԥ��٤��ѹ��Ǥ��ޤ��� �Ĥޤꡢ�쥳�����ѿ��ϡ��ǽ�����������ޤ�����¤����������������äơ��ե�����ɤؤΥ����������ߤ�ȼ¹Ի����顼��ȯ�����ޤ���
RECORD�������Υǡ������ǤϤʤ���ñ�ʤ�ץ졼���ۥ���Ǥ��뤳�Ȥ����դ��Ƥ��������� PL/pgSQL�ؿ���record�����֤��������δؿ��Ǥϥ쥳�����ѿ�����Ѥ��Ƥ��η�̤��ݻ����뤳�Ȥ��Ǥ��ޤ���������ϥ쥳�����ѿ��Ȥ��Ƥγ�ǰ�ȤϤޤä����ۤʤ뤳�Ȥ�ǧ�����٤��Ǥ��� ξ���Ȥ⡢�ؿ��κ����ʳ��ǤϼºݤιԹ�¤�������Ǥ��� ���������쥳�����ѿ��Ϥ��ξ줽�ξ�Ǥ��ιԹ�¤���ѹ��Ǥ���ˤ⤫����餺��record���֤��ؿ��ǤϸƤӽФ������䤤��碌�����Ϥ��줿�����Ǽºݤι�¤�Ϸ��ꤵ��ޤ���
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 ���ޥ�ɤǵ�����褦�ˡ�����ϥơ��֥���ѥ������ޤ��ϼ�����ζɽ��ѿ��˴�Ϣ�Ť���줿�ȹ�����ޤ�