| PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 35. PL/pgSQL - SQL �������� | Fast Forward | Next | 
���ƽṹ������ PL/pgSQL �������õģ��Լ�����Ҫ���IJ����ˡ� ���� PL/pgSQL �Ŀ��ƽṹ�� ������Էdz�������ǿ��ķ������� PostgreSQL �����ݡ�
������������������Ӻ����з������ݣ�RETURN �� RETURN NEXT��
RETURN expression;
�����ʽ�� RETURN ��������ֹ����, Ȼ�� expression ��ֵ���ظ������ߡ�
������ر������ͣ���ô����ʹ���κα��ʽ�����ʽ�����ͽ����Զ�ת���ɺ����ķ������ͣ� ���������ڸ�ֵ�������������� Ҫ����һ�����ϣ��У���ֵ�������дһ����¼�����б����� expression��
һ�������ķ���ֵ������δ���塣������Ƶ����˺��������Ŀ��û������һ�� RETURN ��䣬 ��ô���ͻᷢ��һ������
��ע������������˸ú������� void����ô��Ȼ�������� RETURN ��䣻���ǣ����� RETURN ����ı��ʽ�ǿ�ѡ�ģ��������κ�����¶��ᱻ���ԡ�
RETURN NEXT expression;
���һ�� PL/pgSQL ��������Ϊ���� SETOF sometype�� ��ô��ѭ�Ĺ��������в�ͬ������������£�Ҫ���صĶ����������� RETURN NEXT �����������ģ�Ȼ�������һ������������ RETURN �������ڸ���������������Ѿ����ִ���ˡ� RETURN NEXT �������ڱ��������������ͣ����ں��ߣ�������һ�������Ľ��"��"��
ʹ�� RETURN NEXT �ĺ���Ӧ�ð�������ķ����ã�
SELECT * FROM some_func();
Ҳ����˵���������������FROM�Ӿ������һ��������Դ�ġ�
RETURN NEXT ʵ���ϲ����Ӻ����з��أ� ��ֻ�Ǽذѱ��ʽ��ֵ���������� Ȼ��ִ�м���ִ�� PL/pgSQL ���������һ����䡣 ���ź�̵� RETURN NEXT �����ִ�У� ������ͽ��������ˡ�����һ������Ҫ������ RETURN�� ���¿����˳��ú�����
ע��: Ŀǰ�� PL/pgSQL �� RETURN NEXT ʵ���ڴӺ�������֮ǰ������������������������������������������� ����ζ�����һ�� PL/pgSQL ��������һ���dz���Ľ������ ���ܿ��ܻ�ܲ���ݽ���д���������Ա����ڴ�ľ��� ���Ǻ�����������������������֮ǰ�����˳��������� PL/pgSQL �汾���ܻ������û�����û���������Ƶķ��ؼ��ϵĺ����� Ŀǰ�����ݿ�ʼ�������д��ʱ���������ñ��� work_mem ���Ƶġ� ӵ���㹻�ڴ�Ĺ���Ա��������ڴ���洢����Ľ������ ����Կ��ǰ������������һЩ��
IF ���������Ը���ij������ִ����� PL/pgSQL��������ʽ��IF��
IF ... THEN
IF ... THEN ... ELSE
IF ... THEN ... ELSE IF
IF ... THEN ... ELSIF ... THEN ... ELSE
IF ... THEN ... ELSEIF ... THEN ... ELSE
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;
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;
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����ELSE ����Ƕ����һ��IF��䣮�������Ҫһ��END IF��� ��ÿ��Ƕ��IF�����Ҫһ������IF-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��
������һ�����ӣ�
IF number = 0 THEN
    result := 'zero';
ELSIF number > 0 THEN
    result := 'positive';
ELSIF number < 0 THEN
    result := 'negative';
ELSE
    -- ����һ��Ψһ�Ŀ��������ǿ�ֵ
    result := 'NULL';
END IF;
ELSEIF �� ELSIF �ı�����
ʹ��LOOP��WHILE��FOR �� EXIT ��䣬����Կ������ PL/pgSQL �����ظ�һϵ�����
[<<label>>]
LOOP
    statements
END LOOP;LOOP ����һ����������ѭ��������ѭ����ֱ����EXIT����RETURN�����ֹ�� ��ѡ�ı�ǩ������EXIT���ʹ�ã�������Ƕ��ѭ��������Ӧ�ý�����һ��ѭ����
EXIT [ label ] [ WHEN expression ];
���û�и��� label�� ��ô�˳����ڲ��ѭ����Ȼ��ִ�и���END LOOP�������䡣 ������� label�� ��ô�������ǵ�ǰ���߸��߲��Ƕ��ѭ������߿�ı�ǩ�� Ȼ������������ѭ���ͻ���ֹ���������䵽��Ӧѭ��/��� END �����������ϡ�
���������WHEN��ѭ���˳�ֻ����������������Ϊ���ʱ�� ������ƻ��䵽EXIT���������ϡ�
EXIT �������������е�ѭ����������ǰ�˳��� ��������������������ѭ����ʹ�á�
���ӣ�
LOOP
    -- һЩ����
    IF count > 0 THEN
        EXIT;  -- exit loop
    END IF;
END LOOP;
LOOP
    -- һЩ����
    EXIT WHEN count > 0;
END LOOP;
BEGIN
    -- һЩ����
    IF stocks > 100000 THEN
        EXIT;  -- ���´� BEGIN �����˳�
    END IF;
END;
[<<label>>]
WHILE expression LOOP
    statements
END LOOP;ֻҪ�������ʽΪ�棬WHILE���ͻͣ��һϵ������Ͻ���ѭ��. ��������ÿ�ν���ѭ�����ʱ�����.
����:
WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
    -- ����������������
END LOOP;
WHILE NOT BOOLEAN_expression LOOP
    -- ����������������
END LOOP;
[<<label>>] FOR name IN [ REVERSE ] expression .. expression LOOP statements END LOOP;
������ʽ��FOR��һ����Χ��������ֵ���е�����ѭ���� ����name ���Զ�����Ϊinteger���Ͳ���ֻ��ѭ������ڡ� ������Χ���½���������ʽ�ڽ���ѭ����ʱ�����һ�Ρ� ��������ֵ����Ϊ 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;
����½�����Ͻ磨�������� REVERSE �������С�ڣ�����ôѭ���彫��ȫ����ִ�С� ���Ҳ����׳��κδ���
ʹ�ò�ͬ���͵�FORѭ��������Ա���һ������Ľ��������Ӧ�IJ�����Щ���ݡ���ǣ�
[<<label>>]
FOR record_or_row IN query LOOP
    statements
END LOOP;����ļ�¼�����б�������̱�������������query��������һ�� 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 �ļ�¼
        PERFORM cs_log('Refreshing materialized view ' || quote_ident(mviews.mv_name) || ' ...');
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(mviews.mv_name);
        EXECUTE 'INSERT INTO  ' ||  quote_ident(mview.mv_name) || ' ' || mview.mv_query;
     END LOOP;
     PERFORM cs_log('Done refreshing materialized views.');
     RETURN 1;
END;
$$ LANGUAGE plpgsql;���ѭ������һ��EXIT�����ֹ�ģ���ô��ѭ��֮������Ȼ���Է������ֵ���С�
FOR-IN-EXECUTE����DZ��������е�����һ�ַ�����
[<<label>>]
FOR record_or_row IN EXECUTE text_expression LOOP
    statements
END LOOP;�����������ǰ�����ʽ��ֻ����ԴSELECT�������Ϊ��һ���ִ����ʽ�� ��������ÿ�ν���FORѭ����ʱ�����¼��������ִ�мƻ��� �������������Ա��һ��Ԥ�ȹ滮���˵���������õ��ٶȣ���һ����̬��������õ�����ԣ�����һ����EXECUTE���������֮�����ѡ��
ע��: PL/pgSQL ������Ŀǰ�����������͵�FORѭ�����������߷��ؼ�¼�ģ��� �����Ǽ���Ƿ����κ� .. ������ IN �� LOOP ֮���Բ����֮�⡣ ���û�п��� ..����ô���ѭ���������������ϵ�ѭ���� ��������� .. �ͺܿ��ܻᵼ�������������Ĵ�����Ϣ�� "loop variable of loop over rows must be a record or row variable"�� ������������Ϊ�ῴ���ļ������
ȱʡʱ��һ���� PL/pgSQL ��������Ĵ����˳�������ִ�У� ����ʵ����������Χ������Ҳ���˳��������ʹ��һ������ EXCEPTION �Ӿ�� BEGIN �鲶������Ҵ��лָ��� ����������� BEGIN �����һ����չ��
[ <<label>> ] [ DECLARE declarations ] BEGIN statements EXCEPTION WHEN condition [ OR condition ... ] THEN handler_statements [ WHEN condition [ OR condition ... ] THEN handler_statements ... ] END;
���û�з�������������ʽ�Ŀ�ֻ�Ǽ�ִ������ statements�� ��������� statements �����һ������ ��� statements �Ľ�һ������������ ���ƴ��ݵ��� EXCEPTION �б� ϵͳ��������б�Ѱ��ƥ�䷢���Ĵ���ĵ�һ��Ԫ�ء�����ҵ�ƥ�䣬 ��ִ�ж�Ӧ�� handler_statements��Ȼ����ƴ��ݵ� END ֮�����һ����䡣 ���û���ҵ�ƥ�䣬�ô���ͻ�㲥��ȥ���ͺ������û�� EXCEPTION �Ӿ�һ���� �ô�����Ա�һ����Χ���� EXCEPTION �������û�а�Χ�飬���˳������Ĵ���
condition ���ֿ����� Appendix A ����ʾ���κ����֡� һ��������ƥ������÷�����Ĵ�������������� OTHERS ƥ����� QUERY_CANCELED ֮������д������͡� �����ǿ��������ֲ��� QUERY_CANCELED������ͨ���Dz����ǵġ����������Ǵ�Сд�صġ�
�����ѡ�е� handler_statements ������´��� ��ô�����ܱ���� EXCEPTION �Ӿ䲶���Ǵ�����ȥ�� һ������ EXCEPTION �Ӿ���Բ�������
���һ������ EXCEPTION ����PL/pgSQL �����ľֲ��������ִ�������ʱ���ԭֵ�� �������иÿ�����̻������ݿ��е�״̬���ع�����Ϊһ�����ӣ������ǿ�������Ƭ�ϣ�
    INSERT INTO mytab(firstname, lastname) VALUES('Tom', 'Jones');
    BEGIN
        UPDATE mytab SET firstname = 'Joe' WHERE lastname = 'Jones';
        x := x + 1;
        y := x / 0;
    EXCEPTION
        WHEN division_by_zero THEN
            RAISE NOTICE 'caught division_by_zero';
            RETURN x;
    END;�����Ƶ���� y ��ֵ�ĵط���ʱ���������һ�� division_by_zero ����ʧ�ܡ� ������� EXCEPTION �Ӿ䲶���� RETURN ����ﷵ�ص���ֵ���� x ������ֵ�� ���ǣ��ڸÿ�֮ǰ�� INSERT ������ع���������յĽ�������ݿ���� Tom Jones �� ���� Joe Jones��
��ʾ: ������˳�һ������ EXCEPTION �Ӿ�Ŀ�Ҫ�Ȳ������Ŀ鿪����Ķࡣ ��ˣ�����Ҫ��ʱ��Ҫʹ�� EXCEPTION��