¾�ΥС�������ʸ�� �� 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

42.7. �ǡ����١�����������

PL/Python����⥸�塼��ϼ�ưŪ��plpy�Ȥ���Python�⥸�塼��򥤥�ݡ��Ȥ��ޤ��� ���Υ⥸�塼��δؿ�������ϡ�plpy.foo�Τ褦�˺�������Python�����ɤ�����Ѥ��뤳�Ȥ��Ǥ��ޤ���

42.7.1. �ǡ����١������������ؿ�

plpy�⥸�塼���execute�����prepare�Ȥ���2�Ĥδؿ����Ѱդ��Ƥ��ޤ��� plpy.execute���䤤��碌ʸ���󤪤�Ӿ�ά��ǽ�����°������դ��ƸƤӽФ��ȡ��䤤��碌���¹Ԥ��졢��̥��֥������ȤȤ����䤤��碌��̤��֤�ޤ��� ��̥��֥������Ȥϥꥹ�Ȥ⤷���ϼ��񥪥֥������Ȥ򥨥ߥ�졼�Ȥ��ޤ��� ��̥��֥������Ȥϡ����ֹ����̾�ˤ�äƥ����������뤳�Ȥ��Ǥ��ޤ��� ��̥��֥������Ȥˤϡ��䤤��碌��̤ιԿ����֤�nrows()��SPI_execute���֤��ͤ��֤�status�Ȥ����᥽�åɤ��ɲä���Ƥ��ޤ��� ��̥��֥������Ȥϡ��ѹ����뤳�Ȥ��Ǥ��ޤ���

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

rv = plpy.execute("SELECT * FROM my_table", 5)

����ϡ�my_table����5�ԤޤǤ��֤��ޤ��� my_table��my_column��¸�ߤ����硢������ˤϰʲ��Τ褦�˥��������Ǥ��ޤ���

foo = rv[i]["my_column"]

2���ܤδؿ�plpy.prepare�ϡ��䤤��碌�μ¹Էײ��������ޤ��� �䤤��碌��˥ѥ�᡼�����Ȥ������硢�䤤��碌ʸ���󤪤�Ӱ������Υꥹ�ȤȤȤ�˸ƤӽФ���ޤ��� �㤨�С��ʲ��Τ褦�ˤ��ޤ���

plan = plpy.prepare("SELECT last_name FROM my_users WHERE first_name = $1", [ "text" ])

text�ϡ�$1�Ȥ����Ϥ�����ѿ��η��Ǥ��� ʸ����������塢�����¹Ԥ��뤿��˴ؿ�plpy.execute����Ѥ��ޤ���

rv = plpy.execute(plan, [ "name" ], 5)

3���ܤΰ��������°����Ǥ��ꡢ��ά��ǽ�Ǥ���

�䤤��碌�ѥ�᡼������ӷ�̹ԤΥե�����ɤ�項42.3�Ǽ������̤ꡢPostgreSQL��Python�Υǡ������δ֤��Ѵ�����ޤ��� ����ʣ�緿�����ݡ��Ȥ���Ƥ��ʤ��Ȥ����㳰������ޤ��� ʣ�緿���䤤��碌�ѥ�᡼���Ȥ��Ƥϵ��䤵�졢�䤤��碌�η�̤�¸�ߤ������ʸ������Ѵ�����ޤ��� ��Ԥ�����β�����ˡ�Ȥ��ơ���̹ԤΥե�����ɤȤ��ƤǤϤʤ���̹ԤȤ���ʣ�緿��¸�ߤ���褦���䤤��碌��񤭴����뤳�Ȥ��Ǥ����礬����ޤ��� ¾�ˡ���̤Ȥ���������ʸ�������ȤDz��Ϥ���ʬΥ���뤳�Ȥ�Ǥ��ޤ�����������ˡ�ϻ���˺�������Ƥ��ޤ��ޤ��Τǿ侩����ޤ���

PL/Python�⥸�塼�����Ѥ��ƽ��������ײ�ϼ�ưŪ����¸����ޤ��� ���줬�����̣����Τ��ˤĤ��Ƥ�SPI��ʸ���第43章�ˤ򻲾Ȥ��Ƥ��������� �����ʣ���ƤӽФ��ˤ����Ƹ���Ū�˻��Ѥ��뤿��ˤϡ���³Ū�ʳ�Ǽ�Ѽ���Ǥ���SD�ޤ���GD��項42.4�򻲾ȡˤΤ����줫����Ѥ���ɬ�פ�����ޤ��� �㤨�С��ʲ��Τ褦�ˤ��ޤ���

CREATE FUNCTION usesavedplan() RETURNS trigger AS $$
    if SD.has_key("plan"):
        plan = SD["plan"]
    else:
        plan = plpy.prepare("SELECT 1")
        SD["plan"] = plan
    # rest of function
$$ LANGUAGE plpythonu;

42.7.2. ���顼����ª

�ǡ����١����˥�����������ؿ��ϥ��顼�������������顼���ؿ��򥢥ܡ��Ȥ����㳰��ȯ�������븶���Ȥʤ�ޤ��� plpy.execute�����plpy.prepare�ϡ��ǥե���ȤǤϴؿ���λ������plpy.SPIError�Υ��֥��饹�Υ��󥹥��󥹤�ȯ�������뤳�Ȥ��Ǥ��ޤ��� ���Υ��顼�ϡ�try/except��ʸ����Ѥ��ơ�Python��¾���㳰��Ʊ�ͤ˽����Ǥ��ޤ��� ��򼨤��ޤ���

CREATE FUNCTION try_adding_joe() RETURNS text AS $$
    try:
        plpy.execute("INSERT INTO users(username) VALUES ('joe')")
    except plpy.SPIError:
        "���ޤ������ʤ��ä�" ���֤�
    else:
        "Joe���ɲä��줿" ���֤�
$$ LANGUAGE plpythonu;

ȯ��������㳰�μ¥��饹�ϥ��顼�����������������ξ����б����ޤ��� 表A-1�ˤ���������Υꥹ�Ȥ�����ޤ��Τǻ��Ȥ��Ƥ��������� plpy.spiexceptions�⥸�塼���PostgreSQL�ξ�綠�줾����Ф��ơ����ξ��̾�˰����̾�����㳰���饹��������Ƥ��ޤ��� �㤨��division_by_zero��DivisionByZero��unique_violation��UniqueViolation�ˡ�fdw_error��FdwError�ʤɤΤ褦�ˤʤ�ޤ��� �������㳰���饹�Ϥ��줾��SPIError��Ѿ�������ΤǤ��� ���Τ褦��ʬΥ���뤳�Ȥ�����Υ��顼�����ñ�˰������Ȥ��Ǥ���褦�ˤʤ�ޤ��� �ʲ�����򼨤��ޤ���

CREATE FUNCTION insert_fraction(numerator int, denominator int) RETURNS text AS $$
from plpy import spiexceptions
try:
    plan = plpy.prepare("INSERT INTO fractions (frac) VALUES ($1 / $2)", ["int", "int"])
    plpy.execute(plan, [numerator, denominator])
except spiexceptions.DivisionByZero:
    return "denominator cannot equal zero"
except spiexceptions.UniqueViolation:
    return "already have that fraction"
except plpy.SPIError, e:
    return "other error, SQLSTATE %s" % e.sqlstate
else:
    return "fraction inserted"
$$ LANGUAGE plpythonu;

plpy.spiexceptions�⥸�塼�뤫������Ƥ��㳰��SPIError��Ѿ����뤿�ᡢ�㳰���������except������ƤΥǡ����١��������������顼����ª���뤳�Ȥ����դ��Ƥ���������

�ۤʤä����顼�����������������ˡ�Ȥ��ơ�SPIError�㳰����ª���ơ��㳰���֥������Ȥ�sqlstate°����Ĵ�٤뤳�Ȥˤ�ꡢexcept�֥��å����������٤ʥ��顼�������Ǥ��ޤ��� ����°����"SQLSTATE"���顼�����ɤ�ޤ�ʸ�����ͤǤ��� ������ˡ�ϡ��ۤ�Ʊ����ǽ���󶡤��ޤ���