| 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��