¾�ΥС�������ʸ�� �� 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

19.6. ���湽¤

���湽¤�Ϥ����餯PL/pgSQL�Τ�äȤ�ͭ��(���Ľ���)����ʬ�Ǥ���PL/pgSQL �����湽¤����Ѥ��ơ�PostgreSQL �Υǡ��������˽��𡢶��Ϥ����뤳�Ȥ��Ǥ��ޤ���

19.6.1. �ؿ����������

RETURN expression;

�� (expression) ������ RETURN �ϡ����åȤ��֤��ʤ� PL/pgSQL �ؿ����������ͤ����뤿��˻��Ѥ���ޤ��� �ؿ��Ͻ�λ����expression ���ͤ��ƤӽФ������֤���ޤ���

ʣ�� (��) ���ͤ��֤��ˤϡ��쥳���ɤޤ��Ϲ��ѿ��� expression �Ȥ��Ƶ��Ҥ���ɬ�פ�����ޤ��� �����鷿���֤��ݤϡ��ɤμ��Ǥ���Ѳ�ǽ�Ǥ��� ���μ��η�̤ϡ���ưŪ�˴ؿ������������ͷ��˥��㥹�Ȥ���ޤ��� (�ؿ��� void �����֤��褦�����������硢���Ͼ�ά��ǽ�Ǥ������ɤΤ褦�ʾ��Ǥ�̵�뤵��ޤ���)

�ؿ�������ͤ�̤����Ȥ������ޤޤˤ��뤳�ȤϤǤ��ޤ��� ���椬��RETURN ʸ���ʤ����֤Ǵؿ��κǾ�̤Υ֥��å��ν����ޤ�ã�����Ȥ����¹Ի����顼��ȯ�����ޤ���

PL/pgSQL �ؿ��� SETOF sometype ���֤��褦�����������硢��³�ν�����¿���㤤�ޤ��� ���ξ�硢����ͤθġ��ι��ܤϡ�RETURN NEXT ���ޥ�ɤǻ��ꤵ��ޤ��������ơ������Τʤ��Ǹ�� RETURN ���ޥ�ɤˤ�ꡢ�ؿ����¹Ԥ�λ�������Ȥ�������ޤ��� RETURN NEXT �ϡ������鷿�����ʣ�緿��ξ���ǻ��Ѥ��뤳�Ȥ��Ǥ��ޤ���ʣ�緿�ξ�硢��̤Ρ֥ơ��֥�����Τ��֤���ޤ��� RETURN NEXT ����Ѥ���ؿ��ϡ��ʲ��Τ褦�ʷ����ǸƤӽФ���ޤ���

SELECT * FROM some_func();

�Ĥޤꡢ�ؿ��� FROM ��ǥơ��֥�Υ������Ȥ��ƻ��Ѥ���ޤ���

RETURN NEXT expression;

�ºݤˤϡ�RETURN NEXT �ϴؿ������ͤ��֤��Ƥ���ΤǤϤ���ޤ���ñ�˼����� �ʤ⤷�����֤����ǡ������˱����ƥ쥳�����ѿ��ޤ��Ϲ��ѿ�) ����¸���Ƥ�������Ǥ��� �����ơ����μ¹Ԥ� PL/pgSQL �ؿ���μ���ʸ�˷�³���ޤ��� RETURN NEXT ���ޥ�ɤ�Ϣ³���Ƽ¹Ԥ����ȡ���̥��åȤ���������ޤ��� �Ǹ�� RETURN (���������ꤷ�ʤ�ɬ�פ�����ޤ�) �ˤ�ꡢ�ؿ��ν�λ�����椷�ޤ���

Note: �嵭�Τ褦�ˡ�PL/pgSQL �ˤ����� RETURN NEXT �θ��ߤμ����Ǥϡ��ؿ������֤�������˷�̥��å����Τ��ݴɤ��ޤ��� ����ˤ�ꡢPL/pgSQL �ؿ����������̤η�̥��åȤ��֤�����硢�ѥե����ޥ󥹤��㲼�����ǽ��������ޤ��� ����ξ��פ��򤱤뤿�ᡢ�ǡ����ϥǥ������˽񤭹��ޤ�ޤ������������ؿ����Τϡ���̥��å����Τ����������ޤǤ��֤�ޤ��� ����� PL/pgSQL �ΥС������Ǥϡ��������¤�������˥��åȤ��֤��ؿ���桼��������Ǥ���褦�ˤʤ뤫�⤷��ޤ��� ���ߡ��ǥ������˽񤭤��ޤ��ǡ����γ������ϡ�SORT_MEM �����ѿ��ˤ�ä����椵��Ƥ��ޤ��� ���̤η�̥��åȤ��ݴɤ���Τ˽�ʬ�ʥ��꤬�����硢�����ԤϤ��Υѥ�᡼�����ͤ��礭�����뤳�Ȥ��θ���٤��Ǥ���

19.6.2. ���ʬ��

IF ʸ�Ϥ�����˴�Ť��ƥ��ޥ�ɤ�¹Ԥ����ޤ��� PL/pgSQL �ˤϡ��ʲ��Τ褦�� 4 �Ĥ� IF �η���������ޤ���

19.6.2.1. IF-THEN

IF boolean-expression THEN
    statements
END IF;

IF-THEN ʸ�ϡ��Ǥ�ñ��� IF �η����Ǥ���THEN �� END IF�δ֤�ʸ�� ��郎���ξ��˼¹Ԥ���ޤ�������ʤ���Ф��������Ф���ޤ���

IF v_user_id <> 0 THEN
    UPDATE users SET email = v_email WHERE user_id = v_user_id;
END IF;

19.6.2.2. IF-THEN-ELSE

IF boolean-expression THEN
    statements
ELSE
    statements
END IF;

IF-THEN-ELSE ʸ�� IF-THEN �˲ä������ɾ�������ξ��˼¹Ԥ��٤�ʸ�ν������ꤵ���뤳�Ȥ��Ǥ��ޤ���

IF parentid IS NULL or parentid = ''''
THEN
    return fullname;
ELSE
    return hp_true_filename(parentid) || ''/'' || fullname;
END IF;


IF v_count > 0 THEN
    INSERT INTO users_count(count) VALUES(v_count);
    return ''t'';
ELSE
    return ''f'';
END IF;

19.6.2.3. IF-THEN-ELSE IF

�ʲ�����Τ褦�� IF ʸ������Ҥˤ��뤳�Ȥ��Ǥ��ޤ���

IF demo_row.sex = ''m'' THEN
  pretty_sex := ''man'';
ELSE
  IF demo_row.sex = ''f'' THEN
    pretty_sex := ''woman'';
  END IF;
END IF;

���η�������Ѥ����硢�ºݤ� IF ʸ��¦�� IF ʸ�� ELSE ����ʬ����¦������Ҥˤ��Ƥ��ޤ������äơ�����Ҥˤ��� IF ��� 1 �Ĥ�END IF ʸ�������οƤȤʤ� IF-ELSE ��1�Ĥ�END IF ʸ��ɬ�פǤ�������ˤ�������ư��Ǥ��ޤ������������٤����䤬¿���������Ĺ���餷���ʤ�ޤ���

19.6.2.4. IF-THEN-ELSIF-ELSE

IF boolean-expression THEN
    statements
[ ELSIF boolean-expression THEN
    statements
[ ELSIF boolean-expression THEN
    statements
    ...]]
[ ELSE
    statements ]
END IF;

IF-THEN-ELSIF-ELSE �ϡ�����ʸ��¿�������ؼ��ʤ�������Υ����å��ˡ������������ˡ���󶡤��ޤ��� ���Ȥ��Ƥϡ�IF-THEN-ELSE-IF-THEN ���ޥ�ɤ�����Ҥˤ�����Τ�Ʊ���Ǥ�����ɬ�פ� END IF �� 1 �Ĥ����Ǥ���

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

IF number = 0 THEN
    result := ''zero'';
ELSIF number > 0 THEN
    result := ''positive'';
ELSIF number < 0 THEN
    result := ''negative'';
ELSE
    -- �դ��ࡢ�Ĥ�ͣ��β�ǽ���Ϥ��ο��� NULL �Ǥ��뤳�Ȥ�
    result := ''NULL'';
END IF;

�Ǹ�� ELSE ��Ͼ�ά��ǽ�Ǥ���

19.6.3. ñ��ʥ롼��

LOOP��EXIT��WHILE��FOR ʸ����Ѥ��ơ�PL/pgSQL �ؿ��ǡ����ޥ�ɷ��򷫤��֤����Ȥ��Ǥ��ޤ���

19.6.3.1. LOOP

[<<label>>]
LOOP
    statements
END LOOP;

LOOP �ϡ�EXITʸ�ޤ���RETURN ʸ�ˤ�äƽ�λ�����ޤ�̵�¤˷����֤���롢���̵���Υ롼�פ�������ޤ�����٥륪�ץ����ϡ�����Ҿ��롼�����EXIT ʸ�ǡ��ɤΥ�٥������Ҥ���λ���뤫����ꤹ�뤿��˻��Ѥ���ޤ���

19.6.3.2. EXIT

EXIT [ label ] [ WHEN expression ];

label �����ꤵ��ʤ���硢�Ǥ���¦�Υ롼�פ򽪤餻��END LOOP �μ���ʸ�����θ�˼¹Ԥ���ޤ���label �����ꤵ�줿��硢����ϸ��ߤΥ롼�ס��⤷���ϡ�����Ҥˤʤä��롼�פ�֥��å��γ�¦�Υ�٥�Υ�٥�Ǥ���ɬ�פ�����ޤ������θ塢��̾���줿�롼�פޤ��ϥ֥��å��򽪤餻�����Υ롼�פޤ��ϥ֥��å����б����� END �μ���ʸ�������ܤ��ޤ���

WHEN �������硢���ꤵ�줿��郎���ξ��Τߥ롼�פν�λ��������ޤ��� ����ʤ���С�EXIT �θ�ιԤ����椬�ܤ�ޤ���

��

LOOP
    -- ���餫�α黻
    IF count > 0 THEN
        EXIT;  -- �롼�פν�λ
    END IF;
END LOOP;

LOOP
    -- ���餫�α黻
    EXIT WHEN count > 0;
END LOOP;

BEGIN
    -- ���餫�α黻
    IF stocks > 100000 THEN
        EXIT;  -- �����Ǥ���LOOP�γ�¦�Ǥ� EXIT �ϻ��ѤǤ��ޤ���
    END IF;
END;

19.6.3.3. WHILE

[<<label>>]
WHILE expression LOOP
    statements
END LOOP;

WHILE ʸ�Ͼ�P��ɾ�������Ǥ���֡�ʸ���¤Ӥ򷫤��֤��ޤ������ϡ��롼�����Τ��������ˤΤߥ����å�����ޤ���

���Ȥ��С��ʲ��Τ褦�ˤ��ޤ���

WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
    -- �����DZ黻�򤤤��Ĥ��Ԥ��ޤ���
END LOOP;

WHILE NOT boolean_expression LOOP
    -- �����DZ黻�򤤤��Ĥ��Ԥ��ޤ���
END LOOP;

19.6.3.4. FOR (���� for �롼��)

[<<label>>]
FOR name IN [ REVERSE ] expression .. expression LOOP
    statements
END LOOP;

���μ����FOR �������ͤ��ϰϤ򷫤��֤��롼�פ��������ޤ���name �ѿ����������Ȥ��Ƽ�ưŪ��������졢�롼�������Τߤ�¸�ߤ��ޤ����ϰϤβ��¡���¤Ȥ���Ϳ������2�Ĥμ��ϥ롼�פ����ä����˰��٤���ɾ������ޤ������֤���ߤ��̾� 1 �Ǥ�����REVERSE �����ꤵ�줿���� -1 �Ȥʤ�ޤ���

����FOR�롼�פ����ʲ��˼����ޤ���

FOR i IN 1..10 LOOP
    -- ���򤤤��Ĥ������˵��Ҥ��ޤ���

    RAISE NOTICE ''i is %'',i;
END LOOP;

FOR i IN REVERSE 10..1 LOOP
    -- ���򤤤��Ĥ������˵��Ҥ��ޤ���
END LOOP;

19.6.4. �䤤��碌��̤η��֤�

�̤μ���� FOR �롼�פ���Ѥ��ơ��䤤��碌�η�̤��֤������Υǡ����򰷤����Ȥ��Ǥ��ޤ����ʲ��˹�ʸ�򼨤��ޤ���

[<<label>>]
FOR record | row IN select_query LOOP
    statements
END LOOP;

�쥳���ɤޤ��Ϲ��ѿ��ˤϡ������SELECT�䤤��碌�η�̤Τ��٤ƤιԤ��������졢�ƹԤ��Ф��ƥ롼�����Τ��¹Ԥ���ޤ����ʲ�����򼨤��ޤ���

CREATE FUNCTION cs_refresh_mviews () RETURNS INTEGER AS '
DECLARE
     mviews RECORD;
BEGIN
     PERFORM cs_log(''Refreshing materialized views...'');

     FOR mviews IN SELECT * FROM cs_materialized_views ORDER BY sort_key LOOP

         -- ������ "mviews" �� cs_materialized_views ��1�ĤΥ쥳���ɤ�����ޤ�

         PERFORM cs_log(''Refreshing materialized view '' || quote_ident(mviews.mv_name) || ''...'');
         EXECUTE ''TRUNCATE TABLE  '' || quote_ident(mviews.mv_name);
         EXECUTE ''INSERT INTO '' || quote_ident(mviews.mv_name) || '' '' || mviews.mv_query;
     END LOOP;

     PERFORM cs_log(''Done refreshing materialized views.'');
     RETURN 1;
end;
' LANGUAGE 'plpgsql';

���Υ롼�פ� EXIT ʸ�ǽ�λ������硢�Ǹ�˳�����Ƥ�줿�Ԥ��ͤϥ롼�פ�ȴ������Ǥ⥢���������뤳�Ȥ��Ǥ��ޤ���

FOR-IN-EXECUTE ʸ�ϥ쥳�������Τ򷫤��֤��⤦��Ĥ���ˡ�Ǥ���

[<<label>>]
FOR record | row IN EXECUTE text_expression LOOP
    statements
END LOOP;

����ϡ����Ȥ��� SELECT ʸ��ʸ���󼰤ǻ��ꤵ���������������η����Ȼ��Ƥ��ޤ��� ���μ��� FOR �롼�פγƥ���ȥ��ɾ�����졢�Ʒײ褬�Ԥ��ޤ�������ˤ�ꡢ�ץ�����ޤϡ��̾�� EXECUTE ʸ��Ʊ���褦�˻����˷ײ褵�줿�䤤��碌�ˤ���®���ȡ�ưŪ���䤤��碌�λ��Ľ����������򤹤뤳�Ȥ��Ǥ��ޤ���

Note: PL/pgSQL �ѡ����ϸ��ߤ���(�������֤����쥳���ɤ��֤����Ȥ���)2����� FOR �롼�פ�FOR �θ�ǻ��ꤵ�����Ū�ѿ����쥳����/���ѿ��Ȥ����������Ƥ��뤫�ɤ����Ƕ��̤��Ƥ��ޤ����⤷�ʤ���С������� FOR �롼�פǤ���Ȳ��ꤷ�ޤ��� �ºݤ�����������FOR ���ѿ�̾�ν񤭴ְ㤨�Ȥ��ä����ȤǤ����硢����Ϥɤ��餫�Ȥ�����ľ��Ū�Ǥʤ����顼��å�����������������ޤ���