35.8. �α�

�������һ��ִ������������ǿ�������һ����װ������� �α���Ȼ��ÿ�ζ�ȡ������������ ��ô�ɵ�һ��ԭ�����ڽ�����������dz������ʱ�����ڴ�ľ��� ����Ȼ��PL/pgSQL �û�ͨ�����ص�������� ��Ϊ FOR ѭ���Զ����ڲ�ʹ��һ���α��Ա����ڴ����⡣�� һ������Ȥ���÷���ij���������Է���һ�����������α�����ã� ��������������߶�ȡ���С�����ṩ��һ�ִӺ�������һ����������ֶΡ�

35.8.1. ��������

������ 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 ���Գ�֮Ϊδ�󶨵��� ��Ϊ��û�к��κβ�ѯ��󶨡�

35.8.2. ���α�

����ʹ���α������֮ǰ��������������� �����Ǻ� SQL ���� DECLARE CURSOR ��ȵIJ������� PL/pgSQL ��������ʽ��OPEN��䣬 ��������δ�󶨵��α����������һ�����ڰ󶨵��α������

35.8.2.1. OPEN FOR SELECT

OPEN unbound_cursor FOR SELECT ...;

���α�����򿪣�����ִ�и����IJ�ѯ���α겻�����Ѿ��򿪵ģ� ����������������Ϊһ��δ�󶨵��α꣨Ҳ����˵������Ϊһ���򵥵� refcursor �������� SELECT �����Ǻ������� PL/pgSQL ��� SELECT ����ƽ�ȶԴ��ģ� �ȴ��� PL/pgSQL �ı�����������ִ�мƻ�Ϊ�������ܵĸ��û���������

һ�����ӣ�

OPEN curs1 FOR SELECT * FROM foo WHERE key = mykey;

35.8.2.2. OPEN FOR EXECUTE

OPEN unbound_cursor FOR EXECUTE query-string;

���α��������ִ�и����IJ�ѯ���α겻�����Ѵ򿪵ģ����ұ�������Ϊһ��δ�󶨵��α꣨Ҳ����˵�� ��һ���򵥵� refcursor ���������������ú���Щ���� EXECUTE ����һ���ķ����������ִ����ʽ�� ���������Ǿ���������������������м䷢���仯������ԡ�

һ�����ӣ�

OPEN curs1 FOR EXECUTE 'SELECT * FROM ' || quote_ident($1);

35.8.2.3. ��һ���󶨵��α�

OPEN bound_cursor [ ( argument_values ) ];

������ʽ��OPEN���ڴ�һ���α���������α��������������������ʱ���������һ��ġ� �α겻�����Ѿ��򿪵ġ� ���ҽ������α�����Ϊ���ܲ�����ʱ������вű������һ��ʵ�ʲ���ֵ���ʽ���б� ��Щֵ�������������С�һ���󶨵��α������ƻ�������Ϊ�ɻ���� -- ���������û�е�Ч��EXECUTE��

���ӣ�

OPEN curs2;
OPEN curs3(42);

35.8.3. ʹ���α�

һ�����Ѿ�����һ���α꣬��ô��Ϳ�������������������������

��Щ��������Ҫ�����ںʹ򿪸��α꿪ʼ������ͬһ������� ����ԴӺ����ﷵ��һ�� refcursor ��ֵ��Ȼ���õ����߲������αꡣ �����ڲ���refcursor ֵֻ��һ���������α�����Ļ�Ծ��ѯ����ʹ���ִ����� ������ֿ��Դ�����ȥ�����Ը������� refcursor �����ȵȣ�Ҳ���õ���������ʹ����

������ʹ������Ľ�β���������عرա����һ�� refcursor ֵֻ���ڸ��������ǰ��������һ���򿪵��αꡣ

35.8.3.1. FETCH

FETCH cursor INTO target;

FETCH���α��м�����һ�е�Ŀ���У�Ŀ�������һ���б�����һ����¼������ ������һ�����ŷָ�����ͨ�������б�����SELECT INTO��һ���� ��SELECT INTOһ���������ʹ���������FOUND����Ƿ������һ���С�

һ�����ӣ�

FETCH curs1 INTO rowvar;
FETCH curs2 INTO foo, bar, baz;

35.8.3.2. CLOSE

CLOSE cursor;

CLOSE�ر�֧����һ���򿪵��α��������ʹ�� �������ǾͿ������������֮ǰʩ����Դ�������ͷŵ����α�����������Ժ��ٴδ򿪡�

һ�����ӣ�

CLOSE curs1;

35.8.3.3. �����α�

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;