35.4. ����

�����ڿ���ʹ�õı�����������һ������������������� ��Ψһ��������һ��FORѭ�����ѭ����������һ��������Χ�ڵ����ģ����Զ�����Ϊ������������

PL/pgSQL��������������� SQL �������ͣ����� integer��varchar �� char��

������һЩ�������������ӡ�

user_id integer;
quantity numeric(5);
url varchar;
myrow tablename%ROWTYPE;
myfield tablename.fieldname%TYPE;
arow RECORD;

һ������������һ�����﷨�ǡ�

name [ CONSTANT ] type [ NOT NULL ] [ { DEFAULT | := } expression ];

���������DEFAULT�Ӿ䣬��ô���������ڽ���ÿ��ʱ����ñ����ij�ʼֵ�� ���û�и���DEFAULT�Ӿ䣬��ô�ñ�����ʼ��Ϊ SQL ��ֵ�� CONSTANTѡ������˸ñ�������ֵ����������ֵ�ڸÿ�ķ�Χ�ڱ��ֳ����� ���������NOT NULL����ô����NULL��ֵ������һ������ʱ���� ������������ΪNOT NULL�ı�������������һ���ǿյ�ȱʡֵ��

ȱʡֵ����ÿ�ν���ÿ��ʱ�����ġ���ˣ������ now() ����һ������Ϊ timestamp �ı����������ӵ�к���ʵ�ʵ��õ�ʱ�䣬�����Ǻ���Ԥ�����ʱ�䡣

���ӡ�

quantity integer DEFAULT 32;
url varchar := 'http://mysite.com';
user_id CONSTANT integer := 10;

35.4.1. ���������ı���

���ݸ������IJ��������� $1��$2���ȵ������ı�ʶ���� Ϊ�����ӿɶ��ԣ����ǿ���Ϊ $n ���������������� Ȼ������������ֱ�ʶ��������ָ�����ֵ��

�����ִ��������ķ������ȽϺõ����� CREATE FUNCTION ����������������� ���磺

CREATE FUNCTION sales_tax(subtotal real) RETURNS real AS $$
BEGIN
    RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;

����һ���������� PostgreSQL 8.0 ��ǰ��Ψһ�ķ����� ����ȷ������Ϊ������ʹ�������﷨

name ALIAS FOR $n;

�������ͬһ�����ӿ���������������

CREATE FUNCTION sales_tax(REAL) RETURNS real AS $$
DECLARE
    subtotal ALIAS FOR $1;
BEGIN
    RETURN subtotal * 0.06;
END;
$$ LANGUAGE plpgsql;

�������ӣ�

CREATE FUNCTION instr(varchar,integer) RETURNS integer AS $$
DECLARE
    v_string ALIAS FOR $1;
    index ALIAS FOR $2;
BEGIN
    -- �����һЩ����
END;
$$ LANGUAGE plpgsql;

CREATE FUNCTION concat_selected_fields(in_t tablename) RETURNS text AS $$
BEGIN
    RETURN in_t.f1 || in_t.f3 || in_t.f5 || in_t.f7;
END;
$$ LANGUAGE plpgsql;

���һ�� PL/pgSQL �����ķ�����������Ϊһ����̬���� ��anyelement ���� anyarray������ô�ͻᴴ��һ������IJ����� $0���������������Ǻ�����ʵ�ʷ������ͣ��ʹ�ʵ�����������Ƶ��Ƶ�����һ�� ������ Section 31.2.5���� ��������������������ʵ�ʷ������ͣ��� Section 35.4.2 ����ʾ�������� $0 ��ʼ��Ϊ�գ����ҿ��Ա������޸ģ����ԣ������Ҫ�����������ڱ��淵��ֵ�� ��Ȼ�Ⲣ�DZ���ġ�$0 �����Ը���һ�����������磬��������������κ��� + ��������������������ת��

CREATE FUNCTION add_three_values(v1 anyelement, v2 anyelement, v3 anyelement)
RETURNS anyelement AS $$
DECLARE
    result ALIAS FOR $0;
BEGIN
    result := v1 + v2 + v3;
    RETURN result;
END;
$$ LANGUAGE plpgsql;

35.4.2. ��������

variable%TYPE

%TYPE �ṩһ���������߱��ֶε��������͡� ����������������Ҫ�������ݿ���ֵ�ı��������磬�������� users ��������һ���ֶν� user_id��Ҫ����һ���� users.user_id ������ͬ�ı����������д��

user_id users.user_id%TYPE;

ͨ��ʹ�� %TYPE�������֪�������õĽṹ���������ͣ� ���ң�����Ҫ���ǣ����������������������ڽ����仯�ˣ����磺��� user_id �����ʹ� integer �ij� real������Ҳ����Ҫ�޸���ĺ������塣

%TYPE �Զ�̬�ĺ����ر����ã���Ϊ�ڲ��������������Ϳ����ڲ�ͬ�������Dz�һ���ġ� ���ǿ���ͨ���������IJ������߽��ռλ������ %TYPE �ķ������������ʵı�����

35.4.3. ������

name table_name%ROWTYPE;
name composite_type_name;

һ���������ͱ�������������������row-type�������� ������һ���������Ա���һ��SELECT���� FOR������������һ�У�ֻҪ������ֶμ�ƥ��ñ������������͡� ����ֵ�Ķ������ֶ���ʹ�ó��õĵ��ʾ�����ʵģ����� rowvar.field��

һ���б�����������Ϊ��һ�����еı������ͼ����������ͬ��������ʹ�� table_name%ROWTYPE ��ʾ���� ������Ҳ������������������һ���������͵����֡�����Ϊÿ������һ���������ͬ���������ͣ� �� PostgreSQL ��ʵ��������ν��д��д %ROWTYPE�������� %ROWTYPE ����ʽ��ֲ�Ը��á���

�����IJ��������Ǹ������ͣ���������У������ʱ�� ��Ӧ�ı�ʶ�� $n ����һ���б��������ҿ��Դ���ѡȡ�ֶΣ����� $1.user_id��

��һ�������͵ı����У�ֻ���Է����û�����ı����е����ԣ� ������ OID ��������ϵͳ���ԣ���Ϊ���п�������һ����ͼ���� �������͵�������̳б����� char(n) ���������ֶεijߴ�;��ȡ�

������һ��ʹ�ø������͵����ӣ�

CREATE FUNCTION merge_fields(t_row tablename) RETURNS text AS $$
DECLARE
    t2_row table2name%ROWTYPE;
BEGIN
    SELECT * INTO t2_row FROM table2name WHERE ... ;
    RETURN t_row.f1 || t2_row.f3 || t_row.f5 || t2_row.f7;
END;
$$ LANGUAGE plpgsql;

SELECT merge_fields(t.*) FROM tablename t WHERE ... ;

35.4.4. ��¼����

name RECORD;

��¼�������������ͱ�������������û��Ԥ����Ľṹ�� ������SELECT����FOR�����л�ȡʵ�ʵ��нṹ�� һ���б������ӽṹ������ÿ�θ�ֵ��ʱ��ı䡣 ��������һ������ǣ���һ����¼������������ֵ֮ǰ����û���ӽṹ�� �����κζ����е���������з��ʵ���ͼ��������һ������ʱ����

��ע�� RECORD �����������������ͣ�ֻ��һ��ռλ���� ���ǻ�Ӧ����ʶ���ڰ�һ�� PL/pgSQL ��������Ϊ����record���͵�ʱ�� ����һ����¼�����ĸ������ȫ��ͬ����ʹ�����������ʹ��һ����¼�����������Ľ��Ҳ��ˡ� ����������£�����д������ʱ��ʵ�ʵ��нṹ���Dz�֪���ģ����Ƕ��ڷ��� record �ĺ�����˵�� ʵ�ʵĽṹ���ڵ������IJ�ѯ��������ʱ������ģ����б��������������иı����нṹ��

35.4.5. RENAME

RENAME oldname TO newname;

������� RENAME �����޸�һ����������¼�����е����֡� ��� NEW ���� OLD �ڸ������������ﱻ����һ���������ã� ��ô��������ͺ����á��ּ� ALIAS��

���ӡ�

RENAME id TO user_id;
RENAME this_var TO that_var;

ע��: RENAME ��PostgreSQL7.3 ����������⡣�޲����ë�������ȼ��Ƚϵͣ� ��Ϊ ALIAS �����˴���� RENAME ��ʵ����;��