¾�ΥС�������ʸ�� �� 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

39.7. ��������

�䤤��碌���Τ���٤˼¹Ԥ���ΤǤϤʤ����������������ꤷ�ơ��䤤��碌�򥫥ץ��벽�����䤤��碌�η�̤���٤˿��Ԥ����ɤ߼�뤳�Ȥ��Ǥ��ޤ��� �����Ԥ���ͳ��1�Ĥϡ�������¿���ιԤ�������Υ���θϳ���ɤ����ȤǤ��� �ʤ�������PL/pgSQL�桼�����̾盧����ۤ���ɬ�פϤ���ޤ��� FOR�롼�פϼ�ưŪ�˥������������Ū�˻��Ѥ��ƥ����������ɤ�����Ǥ����� ��궽̣����������ˡ�Ȥ��ơ��ƤӽФ������Ԥ��ɤ߼�뤳�Ȥ�Ǥ���褦�ˡ��������줿��������ؤλ��Ȥ��֤���ˡ������ޤ��� ����ˤ�ꡢ�ؿ��������̤ιԽ�����֤��ݤθ�Ψ�����夷�ޤ���

39.7.1. ���������ѿ������

PL/pgSQL�ˤ����륫������ؤΥ������������ơ����������ѿ����ͳ���ޤ��� ���������ѿ��ϡ�����ü��refcursor�ǡ������Ǥ��� ���������ѿ����������1�Ĥ���ˡ�ϡ�ñ��refcursor�����ѿ��Ȥ���������뤳�ȤǤ��� ¾����ˡ�ϡ��������������ʸ����Ѥ��뤳�ȤǤ��� �ʲ��ˤ��ΰ��̷��򼨤��ޤ���

name [ [ NO ] SCROLL ] CURSOR [ ( arguments ) ] FOR query;

��Oracle�Ȥθߴ����Τ��ᡢFOR��IS���֤������뤳�Ȥ��Ǥ��ޤ����� �⤷SCROLL����ꤹ��С���������ϵ������˰�ư�Ǥ��ޤ��� �⤷NO SCROLL����ꤹ��С��������ιԤμ��Ф��ϤǤ��ޤ��� �ɤ������ꤷ�ʤ������������˼��Ф��Ǥ��뤫���䤤��碌�˰�¸���ޤ��� �⤷arguments������С�name datatype�򥫥�ޤǶ��ڤä��ꥹ�Ȥǡ�Ϳ����줿�䤤��碌��Υѥ�᡼���ͤȤ����ִ������̾����������ޤ��� ����̾���˼ºݤ��ִ�������ͤϡ���������򳫤�����������˻��ꤵ��ޤ���

�ʲ�����򼨤��ޤ���

DECLARE
    curs1 refcursor;
    curs2 CURSOR FOR SELECT * FROM tenk1;
    curs3 CURSOR (key integer) IS SELECT * FROM tenk1 WHERE unique1 = key;

�����3�Ĥ��ѿ�������refcursor�ǡ�����������ޤ������ǽ�Τ�Τ����Ƥ��䤤��碌�˻��ѤǤ���2���ܤˤϴ������䤤��碌�������Х��������Ƥ��ޤ��ʷ���դ����Ƥ��ޤ��ˡ� �ޤ����Ǹ�Τ�Τˤϡ��ѥ�᡼���դ����䤤��碌���Х���ɤ���Ƥ��ޤ� ��key�ϥ������뤬���������������ѥ�᡼���ͤ��֤��������ޤ��ˡ� curs1�ѿ��ϡ�������䤤��碌�˷���դ����Ƥ��ޤ���Τǡ�����Х�����Ǥ���ȸƤФ�ޤ���

39.7.2. ��������򳫤�

�����������Ѥ��ƹԤ���Ф����ˡ��������ɬ�פ�����ޤ��� �ʤ����DECLARE CURSOR SQL���ޥ�ɤ�ư���Ʊ���Ǥ����� PL/pgSQL�ˤ�3�����OPENʸ�����ꡢ���Τ�����2�Ĥϥ���Х���ɥ��������ѿ�����Ѥ����Ĥ��1�ĤϥХ���ɥ��������ѿ�����Ѥ��ޤ���

注意: �Х���ɥ��������ѿ���項39.7.4����������Ƥ���FORʸ�ǡ�����Ū�˥�������򳫤��ʤ��Ƥ���Ѥ��뤳�Ȥ��Ǥ��ޤ���

39.7.2.1. OPEN FOR query

OPEN unbound_cursorvar [ [ NO ] SCROLL ] FOR query;

���������ѿ��ϳ����졢�¹Ԥ���褦���ꤷ���䤤��碌����Ϳ����ޤ��� ���˳�������������򳫤����ȤϤǤ������ޤ�������Х���ɥ��������ѿ��Ȥ��ơʤĤޤꡢñ�ʤ�refcursor�ѿ��Ȥ��ơ��������Ƥ��ʤ���Фʤ�ޤ��� �����䤤��碌��SELECTʸ�Ǥ��뤫���ޤ��ϡ�EXPLAIN�Τ褦�ˡ˲��餫�ιԤ��֤���ΤǤʤ���Фʤ�ޤ��� �����䤤��碌�ϡ�¾��PL/pgSQL��SQLʸ��Ʊ�ͤ���ˡ�ǰ����ޤ��� PL/pgSQL���ѿ�̾���֤�������졢�䤤��碌�ײ�Ϻ����ѤǤ���褦�˥���å��夵��ޤ��� PL/pgSQL�ѿ��������������Ѥ����䤤��碌���������줿�����ѿ���OPEN�����ͤȤʤꡢ���θ���ѹ��ϥ��������ư���˱ƶ����ޤ��� SCROLL�����NO SCROLL���ץ����ΰ�̣�ϥХ���ɥ��������Ʊ�ͤǤ���

�ʲ�����򼨤��ޤ���

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

39.7.2.2. OPEN FOR EXECUTE

OPEN unbound_cursorvar [ [ NO ] SCROLL ] FOR EXECUTE query_string
                                     [ USING expression [, ... ] ];

���������ѿ��ϳ����졢�¹Ԥ���褦���ꤷ���䤤��碌����Ϳ����ޤ��� ���˳�������������򳫤����ȤϤǤ������ޤ�������Х���ɥ��������ѿ��Ȥ��ơʤĤޤꡢñ�ʤ�refcursor�ѿ��Ȥ��ơ��������Ƥ��ʤ���Фʤ�ޤ��� �䤤��碌�ϡ�EXECUTE���ޥ�ɤ�Ʊ����ˡ�ˤ��ʸ���󼰤Ȥ��ƻ��ꤵ��ޤ��� �̾��Ʊ�ͤˡ�����ˤ�ꡢ����˼¹Ԥ���ݤ˰�ä��䤤��碌��ײ�Ǥ���������������ޤ�(項39.10.2����)�� �ޤ����ѿ��ִ������ޥ��ʸ�����ǹԤ��ʤ����Ȥ��̣���ޤ��� EXECUTE��Ʊ�ͤ�USING��𤷤�ưŪ���ޥ�ɤ˥ѥ�᡼���ͤ��������뤳�Ȥ��Ǥ��ޤ��� SCROLL�����NO SCROLL���ץ����ΰ�̣�ϥХ���ɥ��������Ʊ�ͤǤ���

�ʲ�����򼨤��ޤ���

OPEN curs1 FOR EXECUTE 'SELECT * FROM ' || quote_ident(tabname)
                                        || ' WHERE col1 = $1' USING keyvalue;

������Ǥϡ��ơ��֥�̾���䤤��碌��˥ƥ����ȤȤ��������ޤ�ޤ��� ���Τ���SQL���󥸥����������й����뤿���quote_ident()�λ��Ѥ򴫤�ޤ��� col1�Ȥ�����ͤ�USING��ͳ�������ޤ�ޤ��Τǡ���������դ���ɬ�פ�����ޤ���

39.7.2.3. �Х���ɥ�������򳫤�

OPEN bound_cursorvar [ ( argument_values ) ];

��������䤤��碌������դ������������ѿ��򳫤�����˻��Ѥ����OPEN�η����Ǥ��� ���˳�������������򳫤����ȤϤǤ��ޤ��� �°����μ��Υꥹ�Ȥϥ������뤬���������Τ�������줿���ˤΤ߸���ޤ��� �������ͤ��䤤��碌������֤��������ޤ��� �Х���ɥ���������䤤��碌�ײ�Ͼ�˥���å����ǽ�Ȥߤʤ���ޤ��� ���ξ�硢EXECUTE�������ʤ�ΤϤ���ޤ��� SCROLL�����NO SCROLL�����Ǥ��ʤ����Ȥ����դ��Ƥ��������� ���������ư�λ��ͤϤ��Ǥ˷�ޤäƤ��뤫��Ǥ���

�ѿ��������ϥХ���ɥ���������䤤��碌�ǹԤ��뤿�ᡢ����������ͤ��Ϥ���ˡ��2�Ĥ��뤳�Ȥ����դ��Ƥ��������� OPEN���ޥ�ɤ����Τʰ����Ȥ����Τȡ��䤤��碌�ˤ�����PL/pgSQL�ѿ��Ȥ��ư���Ū�˻��Ȥ����ΤǤ��� ���������Х���ɥ��������������������������ѿ���������������ޤ��� �ɤ���ξ��⡢OPEN�μ¹Ի����ѿ��ͤ���ޤ�ޤ���

�㡧

OPEN curs2;
OPEN curs3(42);

39.7.3. ����������

��������򳫤��Ƥ��顢��������������ʸ����Ѥ��ƥ�������򰷤����Ȥ��Ǥ��ޤ���

���������ϡ���������򳫻Ϥ��뤿��˳������ؿ���ǹԤ�ɬ�פϤ���ޤ��� �ؿ�����refcursor�ͤ��֤����ƤӽФ����Ǥ��Υ�����������򤵤��뤳�Ȥ�Ǥ��ޤ��� ������Ū�ˤ�refcursor�ͤϡ���������ؤ�ͭ�����䤤��碌����ĥݡ������̾���򼨤�ñ�ʤ�ʸ����Ǥ��� ����̾���ϡ��ݡ������������Ȥʤ���¾��refcursor�����ѿ����������뤳�Ȥǡ�¾���Ϥ����Ȥ��Ǥ��ޤ�����

���ƤΥݡ�����ϡ�����Ū�˥ȥ�󥶥������ν������Ĥ�����ޤ��� �������äơ�refcursor�ͤϤ��Υȥ�󥶥������ν����ޤǤδ֤Τ߳�������������ؤλ��ȤȤ���ͭ���Ǥ���

39.7.3.1. FETCH

FETCH [ direction { FROM | IN } ] cursor INTO target;

FETCH��SELECT INTO��Ʊ�ͤˡ��������뤫�鼡�ιԤ���Ф����оݤ˳�Ǽ���ޤ��� �оݤȤϡ����ѿ����쥳�����ѿ����ޤ���ñ����ѿ��򥫥�ޤǶ��ڤä��ꥹ�ȤǤ��� SELECT INTO�ξ���Ʊ�͡��ü��FOUND�ѿ��򸡺����뤳�Ȥǡ��Ԥ�����Ǥ������ɤ������ǧ���뤳�Ȥ��Ǥ��ޤ���

direction���ʣ���Ԥ���Ф����Ȥ��Ǥ��륳�ޥ�ɤ������SQL FETCH�ǵ��Ĥ��줿�ɤΤ褦�ʥ��ޥ�ɤ��ǽ�Ǥ��� ���ʤ�����ʲ��Τ�ΤǤ��� NEXT�� PRIOR�� FIRST�� LAST�� ABSOLUTE count�� RELATIVE count�� FORWARD�ޤ��� BACKWARD�� direction��ξ�ά�ϡ�NEXT�λ����Ʊ���Ǥ��� SCROLL���ץ������Ѥ��ƥ������������ޤ��ϳ����ʤ��ȡ�direction���ͤˤ��������ؤΰ�ư���׵�ϼ��Ԥ��ޤ���

cursor̾�ϡ������Ƥ��륫������Υݡ�����򻲾Ȥ���refcursor�ѿ�̾�Ǥʤ���Фʤ�ޤ���

�㡧

FETCH curs1 INTO rowvar;
FETCH curs2 INTO foo, bar, baz;
FETCH LAST FROM curs3 INTO x, y;
FETCH RELATIVE -2 FROM curs4 INTO x;

39.7.3.2. MOVE

MOVE [ direction { FROM | IN } ] cursor;

MOVE���ޥ�ɤϡ��ǡ�������Ф��ʤ��ǥ�������ΰ��֤��ѹ����ޤ��� ��ư��ιԤ��֤��ʤ��ǥ�������ΰ��֤������ѹ����뤳�Ȥ�����С�FETCH���ޥ�ɤ�Ʊ���Ư���򤷤ޤ��� SELECT INTO��Ʊ�ͤˡ��ü���ѿ�FOUND���Ѥ��ơ���ư��˹Ԥ�¸�ߤ��뤫�ɤ����򸡺��Ǥ��ޤ���

direction��ϡ�FETCH SQL���ޥ�ɤǵ�����Ƥ���ʲ����ͤΤ����줫���뤳�Ȥ��Ǥ��ޤ��� NEXT�� PRIOR�� FIRST�� LAST�� ABSOLUTE count�� RELATIVE count�� ALL�� FORWARD [ count | ALL ]���ޤ��� BACKWARD [ count | ALL ] direction��ξ�ά�ϡ�NEXT�λ����Ʊ���Ǥ��� SCROLL���ץ������Ѥ��ƥ������������ޤ��ϳ����ʤ��ȡ�direction���ͤˤ��������ؤΰ�ư���׵�ϼ��Ԥ��ޤ���

��:

MOVE curs1;
MOVE LAST FROM curs3;
MOVE RELATIVE -2 FROM curs4;
MOVE FORWARD 2 FROM curs4;

39.7.3.3. UPDATE/DELETE WHERE CURRENT OF

UPDATE table SET ... WHERE CURRENT OF cursor;
DELETE FROM table WHERE CURRENT OF cursor;

��������ΰ��֤�ơ��֥�ιԤ��ѹ�����С���������ˤ�ä����ꤷ���Ԥ򹹿��ޤ��Ͼõ�Ǥ��ޤ��� ���������䤤��碌�ϲ���������Ƥ���Τ����ä˥��롼�ײ����ʤ��Ȥ��ˤˤĤ��Ƥ����¤����ꡢ����ϥ����������FOR UPDATE����Ѥ��뤳�Ȥ������Ǥ��� ���ܺ٤ˤĤ��Ƥ�DECLARE�ޥ˥奢��ڡ����򻲾Ȳ�������

�ʲ�����򼨤��ޤ���

UPDATE foo SET dataval = myval WHERE CURRENT OF curs1;

39.7.3.4. CLOSE

CLOSE cursor;

CLOSE�ϥݡ�������ظ�ˤ��륫��������Ĥ��ޤ��� �������Ѥ��ƥȥ�󥶥������ν����������˥꥽������������뤳�Ȥ��Ǥ����ޤ������������ѿ�������������ٳ������Ȥ��Ǥ��ޤ���

�㡧

CLOSE curs1;

39.7.3.5. ����������֤�

PL/pgSQL�ؿ��Ǥϡ��ƤӽФ����˥���������֤����Ȥ��Ǥ��ޤ��� ������ˡ�ϡ��ؿ�����ʣ���Ԥޤ���ʣ������֤���硢�äˤ��η�̽��礬�����礭������ͭ�ѤǤ��� �����Ԥ��ˤϡ��ؿ��ϥ�������򳫤����ƤӽФ����˥�������̾���֤��ޤ��ʤ⤷���ϡ��⤷�ƤӽФ����ǥݡ�����̾���狼�äƤ���С�ñ��˻��ꤵ�줿�ݡ�����̾����Ѥ��ƥ�������򳫤��ޤ��ˡ� ����ˤ�ꡢ�ƤӽФ����ϥ������뤫��Ԥ���Ф����Ȥ��Ǥ���褦�ˤʤ�ޤ��� ��������ϸƤӽФ������Ĥ��뤳�Ȥ��Ǥ��ޤ��� �ޤ��ϡ��ȥ�󥶥�����󤬽�λ�����ݤ˼�ưŪ���Ĥ����ޤ���

���������ѤΥݡ�����̾�ϡ��ץ�����ޤ����ꤹ�뤫���ޤ��ϼ�ưŪ����������ޤ��� �ݡ�����̾����ꤹ��ˤϡ��������ˡ�ñ��refcursor�ѿ���ʸ������������ޤ��� refcursor�ѿ���ʸ�����ͤ�OPEN�ˤ�äơ��ظ�Υݡ�����̾�Ȥ��ƻ��Ѥ���ޤ��� ��������refcursor�ѿ���NULL�ξ�硢OPEN�ϼ�ưŪ�˴�¸�Υݡ�����ȶ��礷�ʤ�̾�����������������refcursor�ѿ����������ޤ���

注意: �Х���ɥ��������ѿ��ϡ�����̾����ɽ������ʸ�����ͤǽ��������ޤ��� ���Τ��ᡢ�ץ�����ޤ���������򳫤����������ˤ���񤭤��ʤ��¤ꡢ�ݡ�����̾�ϥ��������ѿ���Ʊ���ˤʤ�ޤ��� ������������Х���ɥ��������ѿ��ν���ͤϥǥե���Ȥ�NULL�Ǥ��� ���Τ��ᡢ��񤭤���Ƥ��ʤ����˼�ưŪ������������դ�̾����������ޤ���

�ʲ�����ϡ��ƤӽФ����ǥ�������̾����ꤹ����ˡ�򼨤��Ƥ��ޤ���

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;
END;
$$ LANGUAGE plpgsql;

-- �����������Ѥ���ˤϡ��ȥ�󥶥�����������Ǥ���ɬ�פ�����ޤ���
BEGIN;

SELECT * FROM myfunc('a', 'b');

FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;

39.7.4. ���������̤��Ф���롼��

����������֤����Ԥ��Ф���ȿ�����뤳�Ȥ��Ǥ���FORʸ�ΰ��郎����ޤ��� ��ʸ�ϰʲ��Τ褦�ˤʤ�ޤ���

[ <<label>> ]
FOR recordvar IN bound_cursorvar [ ( argument_values ) ] LOOP
    statements
END LOOP [ label ];

���������ѿ���������줿�Ȥ������餫���䤤��碌�ȥХ���ɤ���Ƥ��ʤ���Фʤ餺���ޤ����˳�����Ƥ��Ƥ��ʤ�ޤ����� FORʸ�ϼ�ưŪ�˥�������򳫤����롼�פ���ȴ�����Ȥ��˺����Ĥ��ޤ��� �ºݤΰ����ͼ��Υꥹ�Ȥϡ��������뤬�������뤳�Ȥ�������줿���˸¤äƤΤ߽и��Ǥ��ޤ��� �������ͤϡ�OPEN������Ʊ����ˡ�ǡ��䤤��碌������ִ�����ޤ��� recordvar�ѿ��ϡ�record���Ȥ��Ƽ�ưŪ��������졢�롼����ǤΤ�¸�ߤ��ޤ� ��¸�ߤ��뤤���ʤ��ѿ�̾�������롼����Ǥ�̵�뤵��ޤ��ˡ� ��������ˤ�ä��֤��줿���줾��ιԤϤ��Υ쥳�����ѿ��˰���³���Ƴ�����Ƥ�졢�롼�����Τ��¹Ԥ���ޤ���