PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 35. PL/pgSQL - SQL �������� | Fast Forward | Next |
�������һ��ִ������������ǿ�������һ����װ������� �α���Ȼ��ÿ�ζ�ȡ������������ ��ô�ɵ�һ��ԭ�����ڽ�����������dz������ʱ�����ڴ�ľ��� ����Ȼ��PL/pgSQL �û�ͨ�����ص�������� ��Ϊ FOR ѭ���Զ����ڲ�ʹ��һ���α��Ա����ڴ����⡣�� һ������Ȥ���÷���ij���������Է���һ�����������α�����ã� ��������������߶�ȡ���С�����ṩ��һ�ִӺ�������һ����������ֶΡ�
������ PL/pgSQL ����α�ķ��ʶ���ͨ���α����ʵ�ֵģ� ������������������� refcursor�� ����һ���α������һ�������ǰ�������Ϊһ������Ϊ refcursor �ı����� ����һ��������ʹ���α��������ͨ��������������
name CURSOR [ ( arguments ) ] FOR query ;
�����ڼ���Oracle�Ŀ��ǣ�FOR �����滻Ϊ IS���� ����� arguments����ô����һ�����ŷָ��� name datatype ��Ե��б����Ƕ�����Щ�����ò���ֵ�滻���������������е����֡� ʵ�����ڴ�����Щ���ֵ���ֵ���ں������������α��֮��
�������ӡ�
DECLARE curs1 refcursor; curs2 CURSOR FOR SELECT * FROM tenk1; curs3 CURSOR (key integer) IS SELECT * FROM tenk1 WHERE unique1 = key;
����������������������Ϊ refcursor�� ���ǵ�һ�����������κ�������ڶ����Ѿ��� ��һ������������������һ���ǰ���һ������������� ��key �����α��ʱ������һ���������� ���� curs1 ���Գ�֮Ϊδ���� ��Ϊ��û�к��κβ�ѯ���
����ʹ���α������֮ǰ��������������� �����Ǻ� SQL ���� DECLARE CURSOR ��ȵIJ������� PL/pgSQL ��������ʽ��OPEN��䣬 ��������δ���α����������һ�����ڰ��α������
OPEN unbound_cursor FOR SELECT ...;
���α����������ִ�и����IJ�ѯ���α겻�����Ѿ��ģ� ����������������Ϊһ��δ���α꣨Ҳ����˵������Ϊһ���� refcursor �������� SELECT �����Ǻ������� PL/pgSQL ��� SELECT ����ƽ�ȶԴ��ģ� �ȴ��� PL/pgSQL �ı�����������ִ�мƻ�Ϊ�������ܵĸ��û���������
һ�����ӣ�
OPEN curs1 FOR SELECT * FROM foo WHERE key = mykey;
OPEN unbound_cursor FOR EXECUTE query-string;
���α��������ִ�и����IJ�ѯ���α겻�����Ѵģ����ұ�������Ϊһ��δ���α꣨Ҳ����˵�� ��һ���� refcursor ���������������ú���Щ���� EXECUTE ����һ���ķ����������ִ����ʽ�� ���������Ǿ���������������������м䷢���仯������ԡ�
һ�����ӣ�
OPEN curs1 FOR EXECUTE 'SELECT * FROM ' || quote_ident($1);
OPEN bound_cursor [ ( argument_values ) ];
������ʽ��OPEN���ڴ�һ���α���������α��������������������ʱ���������һ��ġ� �α겻�����Ѿ��ġ� ���ҽ������α�����Ϊ���ܲ�����ʱ������вű������һ��ʵ�ʲ���ֵ���ʽ���б� ��Щֵ�������������С�һ�����α������ƻ�������Ϊ�ɻ���� -- ���������û�е�Ч��EXECUTE��
���ӣ�
OPEN curs2; OPEN curs3(42);
һ�����Ѿ�����һ���α꣬��ô��Ϳ�������������������������
��Щ��������Ҫ�����ںʹ��α꿪ʼ������ͬһ������� ����ԴӺ����ﷵ��һ�� refcursor ��ֵ��Ȼ���õ����߲������αꡣ �����ڲ���refcursor ֵֻ��һ���������α�����Ļ�Ծ��ѯ����ʹ���ִ����� ������ֿ��Դ�����ȥ�����Ը������� refcursor �����ȵȣ�Ҳ���õ���������ʹ����
������ʹ������Ľ�β���������عرա����һ�� refcursor ֵֻ���ڸ��������ǰ��������һ�����αꡣ
FETCH cursor INTO target;
FETCH���α��м�����һ�е�Ŀ���У�Ŀ�������һ���б�����һ����¼������ ������һ�����ŷָ�����ͨ�������б�����SELECT INTO��һ���� ��SELECT INTOһ���������ʹ���������FOUND����Ƿ������һ���С�
һ�����ӣ�
FETCH curs1 INTO rowvar; FETCH curs2 INTO foo, bar, baz;
CLOSE cursor;
CLOSE�ر�֧����һ�����α��������ʹ�� �������ǾͿ������������֮ǰʩ����Դ�������ͷŵ����α�����������Ժ��ٴδ�
һ�����ӣ�
CLOSE curs1;
PL/pgSQL ��������������߷����αꡣ ����������ڴӺ����ﷵ�ض��л���С�Ҫ����ô����ʱ�� �ú������α겢�ҰѸ��α�����ַ��ظ������ߡ� ������Ȼ����α���FETCH�С� �α�����ɵ����߹رգ������������������ʱ���Զ��رա�
�������ص��α��������ɵ��������������Զ����ɡ� Ҫ����һ����ʹ�����֣�ֻҪ�ٴ��α�֮ǰ���� refcursor ��������һ���ִ��Ϳ����ˡ� refcursor �������ִ�ֵ���� OPEN �����²����ʹ������ʹ�á� ��������� refcursor �����ǿգ���ô OPEN ���Զ�����һ����������ʹ����ͻ�����֣� Ȼ�������� refcursor ������
ע��: һ�����α���������ֳ�ʼ��Ϊ��Ӧ���ִ�ֵ�������ʹ�����ֺ��α������ͬ���� ���dz���Ա�ٴ��α�֮ǰͨ����ֵ������������֡�����һ��δ���α������ʼ����ʱ��ȱʡ�ǿգ� ��������յ�һ���Զ����ɵ�Ψһ�����֣����DZ����ǡ�
�����������ʾ��һ�������������α����ֵķ�����
CREATE TABLE test (col text); INSERT INTO test VALUES ('123'); CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS ' BEGIN OPEN $1 FOR SELECT col FROM test; RETURN $1; END; ' LANGUAGE plpgsql; BEGIN; SELECT reffunc('funccursor'); FETCH ALL IN funccursor; COMMIT;
���������ʹ�����Զ����ɵ��α�����
CREATE FUNCTION reffunc2() RETURNS refcursor AS ' DECLARE ref refcursor; BEGIN OPEN ref FOR SELECT col FROM test; RETURN ref; END; ' LANGUAGE plpgsql; BEGIN; SELECT reffunc2(); reffunc2 -------------------- <unnamed cursor 1> (1 row) FETCH ALL IN "<unnamed cursor 1>"; COMMIT;
�����������ʾ�˴�һ�������ﷵ�ض���α�ķ�����
CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS $$ BEGIN OPEN $1 FOR SELECT * FROM table_1; RETURN NEXT $1; OPEN $2 FOR SELECT * FROM table_2; RETURN NEXT $2; RETURN; END; $$ LANGUAGE plpgsql; -- ��Ҫ��������ʹ���αꡣ BEGIN; SELECT * FROM myfunc('a', 'b'); FETCH ALL FROM a; FETCH ALL FROM b; COMMIT;