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

23.6. ���湽¤

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

23.6.1. �ؿ����������

RETURN expression;

�ؿ��Ͻ�λ����expression ���ͤ���̤Υ��������塼�����֤���ޤ������μ��η�̤ϼ�ưŪ�˴ؿ������������ͷ��˥��㥹�Ȥ���ޤ���

�ؿ�������ͤ�̤����Ȥ������ޤޤˤ��뤳�ȤϤǤ��ޤ������椬�ؿ��κǾ�̤���Ͽ�ν���ޤǡ�RETURNʸ���ʤ����֤�ã�����Ȥ����¹Ի����顼��ȯ�����ޤ���

23.6.2. ���ʬ��

IF ʸ�Ϥ�����˴�Ť��ƥ��ޥ�ɤ�¹Ԥ����ޤ��� PL/pgSQL �� IF�η����ˤϡ�IF-THEN, IF-THEN-ELSE,IF-THEN-ELSE IF, and IF-THEN-ELSIF-THEN-ELSE �Ȥ���4�Ĥ�����ޤ���

23.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;

23.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;

23.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 ʸ��ɬ�פǤ�������ˤ�������ư��Ǥ��ޤ������������٤����䤬¿���������Ĺ���餷���ʤ�ޤ���

23.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
    -- hmm, the only other possibility is that number IS NULL
    result := ''NULL'';
END IF;

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

23.6.3. ñ��ʥ롼��

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

23.6.3.1. LOOP

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

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

23.6.3.2. EXIT

EXIT [ label ] [ WHEN expression ];

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

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

Examples:

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;

23.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;

23.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;

23.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 ���ѿ�̾��񤭴ְ㤨���Ȥ��ä�������������λ�������Ϥɤ��餫�Ȥ�������ľ��Ū�ʥ��顼��å�����������������ޤ���