| PostgreSQL 9.0.4ʸ�� | ||||
|---|---|---|---|---|
| 前のページ | 巻戻し | 第 39章PL/pgSQL - SQL��³������ | 早送り | 次のページ |
����Ǥϡ�PL/pgSQL���ѼԤ��μ��Ȥ��ƽ��פʡ������ξܺ٤�Ҥ٤ޤ���
PL/pgSQL�ؿ����SQLʸ����Ӽ����ѿ�����Ӵؿ��Υѥ����Ȥ��뤳�Ȥ��Ǥ��ޤ��� �ظ�Ǥϡ�PL/pgSQL�Ϥ����������Ȥ��䤤��碌�ѥ������֤������ޤ��� �ѥ����ޤ����Ȥ�ʸˡŪ�˵�����Ƥ���Ȥ����ǤΤߥѥ������ִ�����ޤ��� ��ü�ʾ��Ȥ��ơ��ʲ��Τ�������ʤ��ץ�����ߥ�����������ͤ��Ƥߤޤ��礦��
INSERT INTO foo (foo) VALUES (foo);
�ǽ�˸����foo�ξ���ʸˡŪ�ˤϥơ��֥�̾�Ǥʤ���Фʤ�ޤ��� ���Τ���ؿ���foo�Ȥ���̾�����ѿ�����äƤ����Ȥ��Ƥ⡢�ִ�����ޤ��� 2���ܤξ��ϥơ��֥����̾�Ǥʤ���Фʤ�ޤ��� ���Τ��ᤳ����ִ�����ޤ��� 3���ܤξ��Τߤ��ؿ����ѿ����Ȥθ���Ǥ���
注意: 9.0�������PostgreSQL�Ǥϡ�3�Ĥξ�礹�٤Ƥˤ������ѿ����ִ����褦�Ȥ�����ʸ���顼������������ޤ�����
�ѿ�̾��ʸˡŪ�ˤϥơ��֥���̾�Ȱ㤤������ޤ���Τǡ��ơ��֥�Ȥ���ʸ����Ǥ����ޤ������Ф��ǽ��������ޤ��� Ϳ����줿̾���ϥơ��֥�����̣����ΤǤ��礦��������Ȥ��ѿ��ʤΤǤ��礦���� ������Τ褦���Ѥ��Ƥߤޤ��礦��
INSERT INTO dest (col) SELECT foo + bar FROM src;
�����Ǥϡ�dest�����src�ϥơ��֥�̾�Ǥʤ���Фʤ�ޤ��� �ޤ���col��dest����Ǥʤ���Фʤ�ޤ���foo�����bar��������ؿ����ѿ����⤷��ޤ���src���⤷��ޤ���
�ǥե���Ȥ�PL/pgSQL��SQLʸ�ˤ�����̾�����ѿ����ơ��֥���Τ����줫�Ȳ�ǽ�ʾ��˥��顼����𤷤ޤ��� �ѿ��ޤ������̾�����ѹ����뤳�Ȥ䤢���ޤ��ʻ��Ȥ����뤳�ȡ�PL/pgSQL�ˤɤ����ͥ�褷�Ʋ�᤹�뤫�����Τ��뤳�Ȥǡ���������������ä��뤳�Ȥ��Ǥ��ޤ���
�Ǥ��ñ�ʲ�ˡ���ѿ�̾�ޤ�����̾���ѹ����뤳�ȤǤ��� ����Ū�ʥ����ǥ���ˡ�Ȥ��ơ����̿̾��PL/pgSQL�ѿ���̿̾�Ȥǵ����ʬ������ˡ������ޤ��� �㤨�С���Ӥ��ƴؿ����ѿ���v_something�Ȥ���̾���Ȥ�����̾��v_�ǻϤޤ�ʤ��褦�ˤ���С�����ϵ�����ޤ���
����¾�������ޤ��ʻ��Ȥ����Τˤ��뤿��˽������뤳�Ȥ��Ǥ��ޤ��� �����Ǥϡ�src.foo�ˤ��ơ��֥���ؤλ��ȤˤĤ��Ƥ����ޤ�������ä��ޤ��� �����ޤ����Τʤ��ѿ����Ȥ�Ԥ�����ˤϡ���٥��դ������֥��å�����ѿ�������������Υ֥��å��Υ�٥����Ѥ��ޤ�(項39.2����)�� �ʲ�������ޤ���
<<block>>
DECLARE
foo int;
BEGIN
foo := ...;
INSERT INTO dest (col) SELECT block.foo + bar FROM src;������block.foo��src��foo���ä��Ȥ��Ƥ⡢�ѿ����̣���뤳�Ȥˤʤ�ޤ��� FOUND�ʤɤ����̤��ѿ���ޤᡢ�ؿ��ѥ�����ؿ�̾�ǽ������뤳�Ȥ��Ǥ��ޤ��� �����ϰ���Ū�˴ؿ�̾���٥�̾�Ȥ�����̥֥��å�����������Ƥ��뤿��Ǥ���
PL/pgSQL���絬�Ϥ����Υ����ɤˤ����롢���٤ƤΤ����ޤ��ʻ��Ȥ������뤳�Ȥ�����Ū�ǤϤʤ���礬����ޤ��� ����������硢PL/pgSQL�ˤ����ޤ��ʻ��Ȥ��ѿ��Ȥ��Ʋ�褹�٤�(����ư���PostgreSQL 9.0�������PL/pgSQL��ư��ȸߴ���������ޤ�)���ޤ��ϡ��ơ��֥��ȤȤ��Ʋ�褹�٤�(Oracle�ʤɤ�¾�Υ����ƥ�ȸߴ���������ޤ�)�Ȼ��ꤹ�뤳�Ȥ��Ǥ��ޤ���
�����ƥ����Τ��Ф��Ƥ���ư����ѹ����뤿��ˤ�plpgsql.variable_conflict����ѥ�����error��use_variable��use_column�Τ����줫�����ꤷ�ޤ�(error��ɸ�����ۤˤ�����ǥե���ȤǤ�)�� ���Υѥ����ϰʹߤ�PL/pgSQL�ؿ���ʸ�Υ���ѥ���˱ƶ����ޤ��������ߤΥ��å����ǥ���ѥ���Ѥߤ�ʸ�ˤϱƶ���Ϳ���ޤ��� PL/pgSQL�������ɤ�������ˤ��Υѥ��������ꤹ�뤿��ˤϡ�postgresql.conf��custom_variable_classes�ꥹ�Ȥ��ɲä���ɬ�פ�����ޤ��� ����������ѹ����뤳�Ȥǡ�PL/pgSQL��ư��ˤ�����ͽ���Ǥ��ʤ��Ѳ���ȯ�����뤳�Ȥ�����ޤ��Τǡ�����ϥ����ѡ��桼���Τߤ��ѹ����뤳�Ȥ��Ǥ��ޤ���
�ޤ����ؿ��ƥ����Ȥ���Ƭ�˰ʲ����ü�ʥ��ޥ�ɤ�1�Ĥ�뤳�Ȥǡ��ؿ�ñ�̤�ư������ꤹ�뤳�Ȥ�Ǥ��ޤ���
#variable_conflict error #variable_conflict use_variable #variable_conflict use_column
�����Υ��ޥ�ɤҤ����ؿ����Ф��ƤΤߡ����ޥ�ɤϱƶ���Ϳ����plpgsql.variable_conflict����������ޤ��� �ʲ�������ޤ���
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
#variable_conflict use_variable
DECLARE
curtime timestamp := now();
BEGIN
UPDATE users SET last_modified = curtime, comment = comment
WHERE users.id = id;
END;
$$ LANGUAGE plpgsql;UPDATE���ޥ�ɤˤ����ơ�curtime��comment�����id�ϡ�users��Ʊ̾�����뤫�ݤ��˴ؤ�餺���ؿ����ѿ��ޤ��ϥѥ����Ȥ��ޤ��� �ơ��֥���Ȥ����뤿���WHERE��ˤ�����users.id�Ȼ��Ȥ�����ɬ�פ����ä����Ȥ����դ��Ʋ������� ������UPDATE�ꥹ�Ȥ��оݤȤ��Ƥ�comment�ؤλ��ȤϽ���������ɬ�פ�����ޤ���Ǥ����� �����ʸˡŪ��users����Ǥʤ���Фʤ�ʤ�����Ǥ��� �ʲ��Τ褦��variable_conflict������˰�¸������Ʊ���ؿ���������뤳�Ȥ�Ǥ��ޤ���
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
<<fn>>
DECLARE
curtime timestamp := now();
BEGIN
UPDATE users SET last_modified = fn.curtime, comment = stamp_user.comment
WHERE users.id = stamp_user.id;
END;
$$ LANGUAGE plpgsql;
�ѿ��ִ���EXECUTE���ޥ�ɤޤ��Ϥ��ΰ���ˤ����륳�ޥ��ʸ�������Ǥϵ�����ޤ��� ���Τ褦�ʥ��ޥ�ɤ˲����ͤ�����������ϡ�項39.5.4�˽Ҥ٤��褦�ˡ�ʸ������ͤ��������Τΰ����Ȥ��뤫USING����Ѥ��Ƥ���������
���ΤȤ����ѿ��ִ��ϡ�SELECT��INSERT��UPDATE��DELETE���ޥ�ɤ�������Ǻ�ư���ޤ��� �ᥤ��SQL�����䤤��碌�ѥ������Υ��ޥ�ɤǤ������Ĥ��ʤ�����Ǥ��� ¾�μ����ʸ���̾�桼�ƥ���ƥ�ʸ�Ȥ����ޤ��ˤˤ����Ʋ���̾�ޤ��ϲ����ͤ���Ѥ���ˤϡ�ʸ����Ȥ��ƥ桼�ƥ���ƥ�ʸ������EXECUTE���Ƥ���������
PL/pgSQL���ץ�ϡ����Ƥ��δؿ����ʳƥ��å����ǡ˸ƤӽФ��줿���ˡ��ؿ��Υ������ƥ����Ȥ���Ϥ����Х��ʥ������̿��ĥ�������Ǻ������ޤ��� ����̿��ĥ�ϴ�����PL/pgSQLʸ��¤���Ѵ�����ޤ������ؿ������θġ���SQL����SQL���ޥ�ɤ�¨�¤��Ѵ�����ޤ���
�Ƽ���SQL���ޥ�ɤ����Ƥ��δؿ��Ǽ¹Ԥ������ˡ�PL/pgSQL���ץ�ϡ�SPI�ޥ͡������SPI_prepare��SPI_saveplan�ؿ�����Ѥ��ơ˼¹Էײ�ν�����Ԥ��ޤ���
���θ�ˤ��μ��䥳�ޥ�ɤ��Ԥ�����ˤϡ����ν������줿�ײ������Ѥ��ޤ���
�������ơ��¹Էײ褬ɬ�פȤ�����䤤��碌����������դ������ɤ���Ĵؿ��Ǥϡ����Υǡ����١�����³��ͭ���ʴּºݤ˻��Ѥ��줿��ʬ�ˤĤ��ƤΤߡ��ײ�ν�������¸���Ԥ��ޤ���
����ˤ�ꡢ���Ϥˤ����������֤ʤ�û�̤���PL/pgSQL�ؿ���ʸ���䤤��碌�ײ���������뤳�Ȥ��Ǥ��ޤ���
����������μ����䤤��碌�Υ��顼�����ؿ��γ�����ʬ���¹Ԥ����ޤǸ��Ф���ʤ����ȤǤ���
��ŵ��Ū�ʹ�ʸ���顼�ϡ��ǽ�β��ˤ����Ƹ��Ф���ޤ����������꿼�����顼�ϡ��¹Ԥλ��ޤǸ��Ф���ޤ���ˡ�
�䤤��碌�ǻ��Ѥ����Ǥ�դΥơ��֥��Ǥ�դΥ������ޤ��ѹ����줿��硢�ޤ��ϡ��䤤��碌�ǻ��Ѥ����桼������ؿ�����������줿��硢��¸���줿�ײ���Ф���ײ�κƺ����ϼ�ưŪ�˹Ԥ��ޤ��� ����ϤۤȤ�ɤξ������˽������줿�ײ�κ����Ѥ�Ʃ��Ū�ˤ����ޤ�����̵���Ȥʤä��ײ褬�����Ѥ���Ƥ��ޤ��������꤬����ޤ��� �㤨�С��桼������黻�Ҥ��������ƺ����������ˤϤ��Ǥ��ݻ�����Ƥ���ײ�˱ƶ���Ϳ���ޤ��� ���������ѹ�����ʤ��ä����Τ褦�˴ؿ����ظ�ˤ��븵�α黻�Ҥ�ƤӽФ�³���ޤ��� ɬ�פ˱����ơ��ǡ����١������å��������Ϥ�뤳�Ȥǥ���å�����������뤳�Ȥ��Ǥ��ޤ���
���Τ褦��PL/pgSQL�ϼ¹Էײ����¸���ޤ��Τǡ�PL/pgSQL�ؿ����ľ�ܸ����SQL���ޥ�ɤϼ¹Ԥ��٤�Ʊ���ơ��֥�ȥե�����ɤȤ��ʤ���Фʤ�ޤ��� �ĤޤꡢSQL���ޥ�ɤˤơ��ơ��֥��ե�����ɤ�̾���Ȥ��ƥѥ�������Ѥ��뤳�Ȥ��Ǥ��ޤ��� �¹Ԥ��٤˿������䤤��碌�ײ���������̵�̤�и�ǡ�PL/pgSQL��EXECUTEʸ��Ȥä�ưŪ�䤤��碌�������뤳�Ȥǡ��������¤����Ǥ��ޤ���
��˽Ҥ٤��褦��PL/pgSQL�ѿ��ͤ���Ѥ����٤��ѹ��Ǥ��뤿��ˡ����������ײ�ϥѥ���������뤳�Ȥ�����¾�ν��פ����Ǥ��� ���ΰ�̣�ϡ�������ѿ��ͤΤ���˺����������ꡢ�ײ�θ�Ψ�������ʤ��礬����Ȥ������ȤǤ��� �ʲ�����ˤ����ơ�
SELECT * INTO myrec FROM dictionary WHERE word LIKE search_term;
search_term��PL/pgSQL�ѿ��Ȥ��ޤ��� �����䤤��碌�ײ�Υ���å��夬��word�Υ���ǥå�������Ѥ��뤳�ȤϤ���ޤ��� �Ȥ����Τϡ��ץ��ʤϼ¹Ի��ˤ�����LIKE�ѥ������ꤷ����Τ��Ȳ���Ǥ��ʤ�����Ǥ��� ����ǥå�������Ѥ��뤿��ˤϡ�LIKE�ѥ��������������Ǥ����䤤��碌��ײ褷�ʤ���Фʤ�ޤ��� ���ξ��⡢EXECUTE���¹Ԥ��Ȥ˺������줿�����ηײ����ѤǤ��ޤ���
�쥳�����ѿ����Ѥ��䤹���Ȥ��������Ϥ�����³�ˤ������̤�����Ȥʤ�ޤ��� �쥳�����ѿ��Υե�����ɤ�����ʸ����ǻ��Ѥ�����硢���Υե�����ɤΥǡ�������ؿ���ƤӽФ��٤��ѹ����ƤϤ����ޤ��� ���줾��μ����ǽ�˼¹Ԥ��줿���Υǡ���������Ѥ��ơ����μ��ηײ褬��������Ƥ��뤫��Ǥ��� ɬ�פʾ��EXECUTE����Ѥ��Ƥ����������뤳�Ȥ��Ǥ��ޤ���
Ʊ��δؿ���2�İʾ�Υơ��֥�Υȥꥬ�Ȥ��ƻ��Ѥ�����硢PL/pgSQL�ϥơ��֥뤴�Ȥηײ��������ƥ���å��夷�ޤ��� ���ʤ�����ơ��Υȥꥬ�ؿ��ȥơ��֥���Ȥ��Ȥ˥���å��夹��ΤǤ��ꡢ�ȥꥬ�ؿ����ȤǤϤ���ޤ��� ���Τ��ᡢ�ǡ��������ѹ���ȼ������ΰ�����ڸ����ޤ��� �㤨�С��̤Υơ��֥�ˤ���ۤʤä��ǡ������Ǥ��äƤ⡢key��̿̾��������Ф��ƥȥꥬ�ؿ���ͭ���˺�ư���ޤ���
Ʊ�ͤˡ�¿�ͷ��ΰ�������ä��ؿ��ϡ��ºݤ˸ƤӽФ������η����Ȥ߹�碌���Ȥ��̡��ηײ��å��夷�ޤ��� ���Τ��ᡢ�ǡ������κ��ۤ�������ͽ�����ʤ����Ԥ������뤳�ȤϤ���ޤ���
�ײ�Υ���å���ˤ�ꡢ���֤˰�¸�����ͤβ��η�̤˰㤤������뤳�Ȥ�����ޤ��� �㤨�С��ʲ���2�Ĥδؿ��η�̤ϰۤʤ�ޤ���
CREATE FUNCTION logfunc1(logtxt text) RETURNS void AS $$
BEGIN
INSERT INTO logtable VALUES (logtxt, 'now');
END;
$$ LANGUAGE plpgsql;�����
CREATE FUNCTION logfunc2(logtxt text) RETURNS void AS $$
DECLARE
curtime timestamp;
BEGIN
curtime := 'now';
INSERT INTO logtable VALUES (logtxt, curtime);
END;
$$ LANGUAGE plpgsql;
logfunc1�ξ��Ǥϡ�PostgreSQL�Υᥤ��ѡ����ϡ�INSERT�Ѥηײ�����������ˡ�logtable���о���η�����'now'��timestamp�Ȳ�ᤷ�ʤ���Фʤ�ʤ����Ȥ��İ����Ƥ��ޤ���
�������ơ��ѡ�����INSERT���ײ褵�줿������'now'��������Ѵ�������������ͤθ�Υ��å�����ͭ�����֤ˤ�����logfunc1�����ƤθƤӽФ��ǻ��Ѥ��ޤ���
�����ޤǤ⤢��ޤ�������ϥץ�����ޤ��տޤ���ư��ǤϤ���ޤ���
logfunc2�ξ��Ǥϡ�PostgreSQL�Υᥤ��ѡ�����'now'�η�����ꤹ�뤳�Ȥ��Ǥ��ޤ���
���Τ��ᡢnow�Ȥ���ʸ��������text���Υǡ����ͤ��֤��ޤ���
curtime���������ѿ�������������ˡ�PL/pgSQL���ץ�Ϥ���ʸ�����text_out��timestamp_in�ؿ����Ѵ��˻��Ѥ���timestamp���˥��㥹�Ȥ��ޤ���
�Ǥ����顢�黻���줿�����ॹ����פϡ��ץ�����ޤ��տޤ����̤ꡢ�¹Ԥ��٤˹�������ޤ���