��PostgreSQL����ե����2025��11��21�����š������å��������
¾�ΥС�������ʸ�� �� 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

40.10. PL/pgSQL�����

����Ǥϡ�PL/pgSQL���ѼԤ��μ��Ȥ��ƽ��פʡ������ξܺ٤�Ҥ٤ޤ���

40.10.1. �ѿ��ִ�

PL/pgSQL�ؿ����SQLʸ����Ӽ����ѿ�����Ӵؿ��Υѥ�᡼���򻲾Ȥ��뤳�Ȥ��Ǥ��ޤ��� �ظ�Ǥϡ�PL/pgSQL�Ϥ����������Ȥ��䤤��碌�ѥ�᡼�����֤������ޤ��� �ѥ�᡼���ޤ����󻲾Ȥ�ʸˡŪ�˵�����Ƥ���Ȥ����ǤΤߥѥ�᡼�����ִ�����ޤ��� ��ü�ʾ��Ȥ��ơ��ʲ��Τ�������ʤ��ץ�����ߥ󥰥�����������ͤ��Ƥߤޤ��礦��

INSERT INTO foo (foo) VALUES (foo);

�ǽ�˸����foo�ξ���ʸˡŪ�ˤϥơ��֥�̾�Ǥʤ���Фʤ�ޤ��� ���Τ���ؿ���foo�Ȥ���̾�����ѿ�����äƤ����Ȥ��Ƥ⡢�ִ�����ޤ��� 2���ܤξ��ϥơ��֥����̾�Ǥʤ���Фʤ�ޤ��� ���Τ��ᤳ����ִ�����ޤ��� 3���ܤξ��Τߤ��ؿ����ѿ����Ȥθ���Ǥ���

注意: 9.0�������PostgreSQL�Ǥϡ�3�Ĥξ�礹�٤Ƥˤ������ѿ����ִ����褦�Ȥ�����ʸ���顼������������ޤ�����

�ѿ�̾��ʸˡŪ�ˤϥơ��֥���̾�Ȱ㤤������ޤ���Τǡ��ơ��֥�򻲾Ȥ���ʸ����Ǥ����ޤ������Ф��ǽ��������ޤ��� Ϳ����줿̾���ϥơ��֥�����̣����ΤǤ��礦��������Ȥ��ѿ��ʤΤǤ��礦���� ������򼡤Τ褦���Ѥ��Ƥߤޤ��礦��

INSERT INTO dest (col) SELECT foo + bar FROM src;

�����Ǥϡ�dest�����src�ϥơ��֥�̾�Ǥʤ���Фʤ�ޤ��� �ޤ���col��dest����Ǥʤ���Фʤ�ޤ��󤬡�foo�����bar��������ؿ����ѿ����⤷��ޤ��󤷡�src���󤫤⤷��ޤ���

�ǥե���Ȥ�PL/pgSQL��SQLʸ�ˤ�����̾�����ѿ����ơ��֥���Τ����줫�򻲾Ȳ�ǽ�ʾ��˥��顼����𤷤ޤ��� �ѿ��ޤ������̾�����ѹ����뤳�Ȥ䤢���ޤ��ʻ��Ȥ򽤾����뤳�ȡ�PL/pgSQL�ˤɤ����ͥ�褷�Ʋ�᤹�뤫�����Τ��뤳�Ȥǡ���������������ä��뤳�Ȥ��Ǥ��ޤ���

�Ǥ��ñ�ʲ�ˡ���ѿ�̾�ޤ�����̾���ѹ����뤳�ȤǤ��� ����Ū�ʥ����ǥ���ˡ�Ȥ��ơ����̿̾��PL/pgSQL�ѿ���̿̾�Ȥǵ����ʬ������ˡ������ޤ��� �㤨�С���Ӥ��ƴؿ����ѿ���v_something�Ȥ���̾���Ȥ�����̾��v_�ǻϤޤ�ʤ��褦�ˤ���С�����ϵ�����ޤ���

����¾�������ޤ��ʻ��Ȥ����Τˤ��뤿��˽������뤳�Ȥ��Ǥ��ޤ��� �����Ǥϡ�src.foo�ˤ��ơ��֥���ؤλ��ȤˤĤ��Ƥ����ޤ�������ä��ޤ��� �����ޤ����Τʤ��ѿ����Ȥ�Ԥ�����ˤϡ���٥��դ������֥��å�����ѿ�������������Υ֥��å��Υ�٥����Ѥ��ޤ�(項40.2����)�� �ʲ�����򼨤��ޤ���

<<block>>
DECLARE
    foo int;
BEGIN
    foo := ...;
    INSERT INTO dest (col) SELECT block.foo + bar FROM src;

������block.foo��src��foo�󤬤��ä��Ȥ��Ƥ⡢�ѿ����̣���뤳�Ȥˤʤ�ޤ��� FOUND�ʤɤ����̤��ѿ���ޤᡢ�ؿ��ѥ�᡼����ؿ�̾�ǽ������뤳�Ȥ��Ǥ��ޤ��� �����ϰ���Ū�˴ؿ�̾���٥�̾�Ȥ�����̥֥��å�����������Ƥ��뤿��Ǥ���

PL/pgSQL���絬�Ϥ����Υ����ɤˤ����롢���٤ƤΤ����ޤ��ʻ��Ȥ������뤳�Ȥ�����Ū�ǤϤʤ���礬����ޤ��� ����������硢PL/pgSQL�ˤ����ޤ��ʻ��Ȥ��ѿ��Ȥ��Ʋ�褹�٤�(����ư���PostgreSQL 9.0�������PL/pgSQL��ư��ȸߴ���������ޤ�)���ޤ��ϡ��ơ��֥��󻲾ȤȤ��Ʋ�褹�٤�(Oracle�ʤɤ�¾�Υ����ƥ�ȸߴ���������ޤ�)�Ȼ��ꤹ�뤳�Ȥ��Ǥ��ޤ���

�����ƥ����Τ��Ф��Ƥ���ư����ѹ����뤿��ˤ�plpgsql.variable_conflict����ѥ�᡼����error��use_variable��use_column�Τ����줫�����ꤷ�ޤ�(error��ɸ�����ۤˤ�����ǥե���ȤǤ�)�� ���Υѥ�᡼���ϰʹߤ�PL/pgSQL�ؿ���ʸ�Υ���ѥ���˱ƶ����ޤ��������ߤΥ��å����ǥ���ѥ���Ѥߤ�ʸ�ˤϱƶ���Ϳ���ޤ��� ����������ѹ����뤳�Ȥǡ�PL/pgSQL��ư��ˤ�����ͽ���Ǥ��ʤ��Ѳ���ȯ�����뤳�Ȥ�����ޤ��Τǡ�����ϥ����ѡ��桼���Τߤ��ѹ����뤳�Ȥ��Ǥ��ޤ���

�ޤ����ؿ��ƥ����Ȥ���Ƭ�˰ʲ����ü�ʥ��ޥ�ɤ�1�Ĥ򤤤�뤳�Ȥǡ��ؿ�ñ�̤�ư������ꤹ�뤳�Ȥ�Ǥ��ޤ���

#variable_conflict error
#variable_conflict use_variable
#variable_conflict use_column

�����Υ��ޥ�ɤ򵭽Ҥ����ؿ����Ф��ƤΤߡ����ޥ�ɤϱƶ���Ϳ����plpgsql.variable_conflict��������񤭤��ޤ��� �ʲ�����򼨤��ޤ���

CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
    #variable_conflict use_variable
    DECLARE
        curtime timestamp := now();
    BEGIN
         UPDATE users SET last_modified = curtime, comment = comment
           WHERE users.id = id;
    END;
$$ LANGUAGE plpgsql;

UPDATE���ޥ�ɤˤ����ơ�curtime��comment�����id�ϡ�users��Ʊ̾���󤬤��뤫�ݤ��˴ؤ�餺���ؿ����ѿ��ޤ��ϥѥ�᡼���򻲾Ȥ��ޤ��� �ơ��֥���򻲾Ȥ����뤿���WHERE��ˤ�����users.id�Ȼ��Ȥ򽤾�����ɬ�פ����ä����Ȥ����դ��Ʋ������� ������UPDATE�ꥹ�Ȥ��оݤȤ��Ƥ�comment�ؤλ��ȤϽ���������ɬ�פ�����ޤ���Ǥ����� �����ʸˡŪ��users����Ǥʤ���Фʤ�ʤ�����Ǥ��� �ʲ��Τ褦��variable_conflict������˰�¸������Ʊ���ؿ���������뤳�Ȥ�Ǥ��ޤ���

CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
    <<fn>>
    DECLARE
        curtime timestamp := now();
    BEGIN
        UPDATE users SET last_modified = fn.curtime, comment = stamp_user.comment
          WHERE users.id = stamp_user.id;
    END;
$$ LANGUAGE plpgsql;

�ѿ��ִ���EXECUTE���ޥ�ɤޤ��Ϥ��ΰ���ˤ����륳�ޥ��ʸ�������Ǥϵ�����ޤ��� ���Τ褦�ʥ��ޥ�ɤ˲����ͤ�����������ϡ�項40.5.4�˽Ҥ٤��褦�ˡ�ʸ������ͤ��������Τΰ����Ȥ��뤫USING����Ѥ��Ƥ���������

���ΤȤ����ѿ��ִ��ϡ�SELECT��INSERT��UPDATE��DELETE���ޥ�ɤ�������Ǻ�ư���ޤ��� �ᥤ��SQL���󥸥��䤤��碌�ѥ�᡼���򤳤��Υ��ޥ�ɤǤ������Ĥ��ʤ�����Ǥ��� ¾�μ����ʸ���̾�桼�ƥ���ƥ�ʸ�Ȥ����ޤ��ˤˤ����Ʋ���̾�ޤ��ϲ����ͤ���Ѥ���ˤϡ�ʸ����Ȥ��ƥ桼�ƥ���ƥ�ʸ������EXECUTE���Ƥ���������

40.10.2. �ײ�Υ���å���

PL/pgSQL���󥿥ץ꥿�ϡ����Ƥ��δؿ����ʳƥ��å����ǡ˸ƤӽФ��줿���ˡ��ؿ��Υ������ƥ����Ȥ���Ϥ����Х��ʥ������̿��ĥ꡼�������Ǻ������ޤ��� ����̿��ĥ꡼�ϴ�����PL/pgSQLʸ��¤���Ѵ�����ޤ������ؿ������θġ���SQL����SQL���ޥ�ɤ�¨�¤��Ѵ�����ޤ���

�Ƽ���SQL���ޥ�ɤ����Ƥ��δؿ��Ǽ¹Ԥ������ˡ�PL/pgSQL���󥿥ץ꥿�ϡ�SPI�ޥ͡������SPI_prepare�ؿ�����Ѥ��ơ��ץ�ڥ��ɥ��ơ��ȥ��Ȥ�������뤿��˥��ޥ�ɤ���Ϥ��ޤ��� ���θ�ˤ��μ��䥳�ޥ�ɤ��Ԥ�����ˤϡ����Υץ�ڥ��ɥ��ơ��ȥ��Ȥ�����Ѥ��ޤ��� �������ơ���ä���ʬ������ʤ�����դ������ɥѥ�����Ĵؿ��Ǥϡ����ߤΥ��å����Ǽ¹Ԥ���ʤ������Υ��ޥ�ɤβ��Ϥˤ�륪���С��إåɤ����餤���ळ�ȤϤ���ޤ��� ����������μ����䤤��碌�Υ��顼�����ؿ��γ�����ʬ���¹Ԥ����ޤǸ��Ф���ʤ����ȤǤ��� ��ŵ��Ū�ʹ�ʸ���顼�ϡ��ǽ�β��ˤ����Ƹ��Ф���ޤ����������꿼�����顼�ϡ��¹Ԥλ��ޤǸ��Ф���ޤ���ˡ�

PL/pgSQL�ϡ����Τˤ�SPI�ޥ͡�����ϡˤ��������Υץ�ڥ��ɥ��ơ��ȥ��Ȥ˴ؤ���¹Էײ�Υ���å�����ԤǤ��ޤ��� ����å��夷���¹Էײ褬���Ѥ���ʤ��ä���硢�ץ�ڥ��ɥ��ơ��ȥ��Ȥ��ƤӽФ�����٤˿������¹Էײ褬�������졢���򤷤��¹Էײ���Ŭ�ˤ��뤿��ˡ��ǿ��Υѥ�᡼���͡ʤ��ʤ��PL/pgSQL���ѿ��͡ˤ����Ѥ���ޤ��� �ץ�ڥ��ɥ��ơ��ȥ��Ȥ��ѥ�᡼��������ʤ����������Ѥ�����硢SPI�ޥ͡����������Υѥ�᡼���ͤ˰�¸���ʤ�����Ū�ʼ¹Էײ�κ�����ͤ����ƻ��ѤΤ���˥���å��夷�ޤ��� ŵ��Ū�ˤϡ�����ϻ��Ȥ���PL/pgSQL���ѿ��ͤ����¹Էײ�ˤ��ۤɱƶ����ʤ����ˤ���������ޤ��� ����ʤ�С����μ¹Էײ�κ���������ͥ��Ƥ��ޤ��� �ץ�ڥ��ɥ��ơ��ȥ��Ȥκ�ư�˴ؤ��Ƥ�ä��Τꤿ���ʤ�PREPARE�򻲾Ȥ��Ƥ���������

���Τ褦��PL/pgSQL�ϥץ�ڥ��ɥ��ơ��ȥ��Ȥ���ӻ��ˤϼ¹Էײ����¸���ޤ��Τǡ�PL/pgSQL�ؿ����ľ�ܸ����SQL���ޥ�ɤϼ¹Ԥ��٤�Ʊ���ơ��֥�ȥե�����ɤ򻲾Ȥ��ʤ���Фʤ�ޤ��� �ĤޤꡢSQL���ޥ�ɤˤơ��ơ��֥��ե�����ɤ�̾���Ȥ��ƥѥ�᡼������Ѥ��뤳�Ȥ��Ǥ��ޤ��� �¹Ԥ��٤˿������¹Էײ���������̵�̤�и�ǡ�PL/pgSQL��EXECUTEʸ��Ȥä�ưŪ�䤤��碌�������뤳�Ȥǡ��������¤����Ǥ��ޤ���

�쥳�����ѿ����Ѥ��䤹���Ȥ��������Ϥ�����³�ˤ������̤�����Ȥʤ�ޤ��� �쥳�����ѿ��Υե�����ɤ�����ʸ����ǻ��Ѥ�����硢���Υե�����ɤΥǡ�������ؿ���ƤӽФ��٤��ѹ����ƤϤ����ޤ��� ���줾��μ����ǽ�˼¹Ԥ��줿���Υǡ���������Ѥ��ơ����μ������Ϥ���Ƥ��뤫��Ǥ��� ɬ�פʾ��EXECUTE����Ѥ��Ƥ����������򤹤뤳�Ȥ��Ǥ��ޤ���

Ʊ��δؿ���2�İʾ�Υơ��֥�Υȥꥬ�Ȥ��ƻ��Ѥ�����硢PL/pgSQL�ϥơ��֥뤴�ȤΥץ�ڥ��ɥ��ơ��ȥ��Ȥ򥭥�å��夷�ޤ��� ���ʤ�����ơ��Υȥꥬ�ؿ��ȥơ��֥���Ȥ��Ȥ˥���å��夹��ΤǤ��ꡢ�ȥꥬ�ؿ����ȤǤϤ���ޤ��� ���Τ��ᡢ�ǡ��������ѹ���ȼ������ΰ�����ڸ����ޤ��� �㤨�С��̤Υơ��֥�ˤ���ۤʤä��ǡ������Ǥ��äƤ⡢key��̿̾��������Ф��ƥȥꥬ�ؿ���ͭ���˺�ư���ޤ���

Ʊ�ͤˡ�¿�ͷ��ΰ�������ä��ؿ��ϡ��ºݤ˸ƤӽФ������η����Ȥ߹�碌���Ȥ��̡��Υץ�ڥ��ɥ��ơ��ȥ��Ȥ򥭥�å��夷�ޤ��� ���Τ��ᡢ�ǡ������κ��ۤ�������ͽ�����ʤ����Ԥ������뤳�ȤϤ���ޤ���

�ץ�ڥ��ɥ��ơ��ȥ��ȤΥ���å���ˤ�ꡢ���֤˰�¸�����ͤβ��η�̤˰㤤������뤳�Ȥ�����ޤ��� �㤨�С��ʲ���2�Ĥδؿ��η�̤ϰۤʤ�ޤ���

CREATE FUNCTION logfunc1(logtxt text) RETURNS void AS $$
    BEGIN
        INSERT INTO logtable VALUES (logtxt, 'now');
    END;
$$ LANGUAGE plpgsql;

�����

CREATE FUNCTION logfunc2(logtxt text) RETURNS void AS $$
    DECLARE
        curtime timestamp;
    BEGIN
        curtime := 'now';
        INSERT INTO logtable VALUES (logtxt, curtime);
    END;
$$ LANGUAGE plpgsql;

logfunc1�ξ��Ǥϡ�PostgreSQL�Υᥤ��ѡ����ϡ�INSERT����Ϥ�����ˡ�logtable���о���η�����'now'��timestamp�Ȳ�ᤷ�ʤ���Фʤ�ʤ����Ȥ��İ����Ƥ��ޤ��� �������ơ��ѡ�����INSERT�����Ϥ��줿������'now'��timestamp������Ѵ�������������ͤ򤽤θ�Υ��å�����ͭ�����֤ˤ�����logfunc1�����ƤθƤӽФ��ǻ��Ѥ��ޤ��� �����ޤǤ⤢��ޤ��󤬡�����ϥץ�����ޤ��տޤ���ư��ǤϤ���ޤ��� now()�ޤ���current_timestamp�ؿ��λ��Ѥ�ͥ��Ƥ��ޤ���

logfunc2�ξ��Ǥϡ�PostgreSQL�Υᥤ��ѡ�����'now'�η�����ꤹ�뤳�Ȥ��Ǥ��ޤ��� ���Τ��ᡢnow�Ȥ���ʸ��������text���Υǡ����ͤ��֤��ޤ��� curtime���������ѿ�������������ˡ�PL/pgSQL���󥿥ץ꥿�Ϥ���ʸ�����text_out��timestamp_in�ؿ����Ѵ��˻��Ѥ���timestamp���˥��㥹�Ȥ��ޤ��� �Ǥ����顢�黻���줿�����ॹ����פϡ��ץ�����ޤ��տޤ����̤ꡢ�¹Ԥ��٤˹�������ޤ��� ������ˡ�Ǥ��ޤ��ްտޤ����̤�ư������ɡ�����ۤɸ�ΨŪ�ǤϤ���ޤ��� �Ǥ����顢now()�ؿ��λ��Ѥ�����ͥ��Ƥ��ޤ���