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

9.2. �䤤��碌���� (SQL) �ؿ�

SQL�ؿ��ϡ�Ǥ�դ�SQL�䤤��碌ʸ�Υꥹ�Ȥ�¹Ԥ������Υꥹ�ȤκǸ���䤤��碌�η�̤��֤��ޤ��� ���κǸ���䤤��碌�� SELECT �Ǥʤ���Фʤ�ޤ���ñ���(��set��)��硢�Ǹ���䤤��碌�η�̤κǽ�ιԤ��֤���ޤ��� (ʣ���Ԥη�̤Τ�����"�ǽ�ι�"�ϡ�ORDER BY ����Ѥ��ʤ��¤�����Ť��뤳�Ȥ��Ǥ��ʤ����ȤϳФ��Ƥ����Ʋ�������)�Ǹ���䤤��碌������Ԥ��֤��ʤ����� NULL ���֤���ޤ���

¾�ˤ⡢SQL �ؿ��ϡ�SETOF sometype �����֤��褦�˻��ꤹ�뤳�Ȥˤ�ꡢ set ���֤��褦��������뤳�Ȥ�Ǥ��ޤ������ξ�硢�Ǹ���䤤��碌�η�̤����ƤιԤ��֤���ޤ������ܺ٤ϸ���������ޤ���

SQL �ؿ������Τϡ����ߥ�����Ƕ��ڤä� 1 �İʾ�� SQL ʸ�Υꥹ�ȤǤʤ���Фʤ�ޤ���CREATE FUNCTION ���ޥ�ɤι�ʸ�Ǥϡ��ؿ������Τ�ñ�������dz��ɬ�פ�����ޤ��Τǡ��ؿ�������ǻ��Ѥ����ñ�������(')��2�Ĥ�ñ�������((''))���Хå�����å���(\')����������ʬ���դ��ơ����������פ��ʤ���Фʤ�ޤ���

SQL�ؿ��ΰ����ϴؿ�������� $n �Ȥ�����ʸ���Ѥ���ɽ�����Ȥ��Ǥ��ޤ����Ĥޤꡢ$1����1�����򼨤���$2����2����...�Ȥʤ�ޤ���������ʣ�緿�ξ�硢$1.emp �Τ褦�� "�ɥå�ɽ��" ���Ѥ��ư�����°���˥����������뤳�Ȥ��Ǥ��ޤ���

9.2.1. ��

��ñ��SQL�ؿ�����Ȥ��ơ������ζ�Ը��¤Τ��餪�������Ф��������������

CREATE FUNCTION tp1 (integer, numeric) RETURNS integer AS '
    UPDATE bank
        SET balance = balance - $2
        WHERE accountno = $1;
    SELECT 1;
' LANGUAGE SQL;

�桼���ϲ����δؿ���Ȥäơ������ֹ�17����100�ɥ������Ф����Ȥ���ǽ�Ǥ���

SELECT tp1(17, 100.0);

�ºݤˤϡ��ؿ��η�̤���� "1" ����ʬ����䤹�����ˤ��뤿��ˡ��ʲ��Τ褦���������Ȥ褤�Ǥ��礦��

CREATE FUNCTION tp1 (integer, numeric) RETURNS numeric AS '
    UPDATE bank
        SET balance = balance - $2
        WHERE accountno = $1;
    SELECT balance FROM bank WHERE accountno = $1;
' LANGUAGE SQL;

����ˤ��Ĺ⤬�׻����졢�������Ĺ���֤��ޤ���

SQL ������Υ��ޥ�ɤν���ϡ����ƤޤȤ�ơ�1�Ĥδؿ��Ȥ���������뤳�Ȥ��Ǥ��ޤ������Υ��ޥ�ɤˤϡ�SELECT �ʳ��ˤ�ǡ������ѹ�������(�ĤޤꡢINSERT, UPDATE, ����ӡ�DELETE) ��ޤळ�Ȥ��Ǥ��ޤ������������Ǹ�Υ��ޥ�ɤ� ���δؿ�������ͷ��ǻ��ꤷ����Τ��֤���SELECT �Ǥ���ɬ�פ�����ޤ��� �ޤ������������ϹԤ����ͤ��֤��ʤ� SQL �ؿ���������������ϡ�void ���֤��褦��������뤳�Ȥ��Ǥ��ޤ��� ���ξ�硢 �Ǹ�Υ��ޥ�ɤ� SELECT �ˤ��ƤϤʤ�ޤ��󡣤��Ȥ��С��ʲ��Τ褦�ˤ��ޤ���

CREATE FUNCTION clean_EMP () RETURNS void AS '
    DELETE FROM EMP
        WHERE EMP.salary <= 0;
' LANGUAGE SQL;

SELECT clean_EMP();

 clean_emp
-----------

(1 row)

9.2.2. ���ܷ�����Ѥ��� SQL �ؿ�

SQL �ؿ��κǤ�ñ��ʤ�Τϡ�������Ȥ�ʤ���integer ���Τ褦�ʴ��ܷ���ñ���֤���ΤǤ���

CREATE FUNCTION one() RETURNS integer AS '
    SELECT 1 as RESULT;
' LANGUAGE SQL;

SELECT one();

one
-----
   1

�ؿ�������Ǵؿ��η���Ѥ������̾��(RESULT �Ȥ���̾����)����������Ȥ����ܤ��Ƥ��������� ���������������̾�Ϥ��δؿ�������ϲĻ�ǤϤ���ޤ��󡣽��äơ����η�̤� RESULT �ǤϤʤ���one �Ȥ�����٥��ɽ������Ƥ��ޤ���

���ܷ�������Ȥ��ƤȤ롢SQL �ؿ���������뤳�ȤϤۤȤ�ɤξ���ñ�Ǥ����ʲ�����ǡ��ؿ������Ǥ��ΰ����� $1 �� $2 �Ȥ��ƥ����������Ƥ��뤳�Ȥ����դ��Ʋ�������

CREATE FUNCTION add_em(integer, integer) RETURNS integer AS '
    SELECT $1 + $2;
' LANGUAGE SQL;

SELECT add_em(1, 2) AS answer;

 answer
--------
      3

9.2.3. ʣ�緿����Ѥ��� SQL �ؿ�

�ؿ���ʣ�緿�ΰ�����Ȥ�褦�˻��ꤷ����硢(������ $1 �� $2 ����Ѥ��ƹԤä��褦��)�ɤΰ�������Ѥ��뤫����ꤹ������ǤϤʤ������ΰ�����°������ꤹ��ɬ�פ�����ޤ����㤨�С�EMP �����Ȱ��ǡ�������ĥơ��֥롢�Ĥޤꡢ���Υơ��֥�ƹԤ�ʣ�緿��̾���Ǥ���Ȥ��ޤ����ʲ��ˡ���Ϳ���ܳۤ�׻����롢double_salary �ؿ��򼨤��ޤ���

CREATE FUNCTION double_salary(EMP) RETURNS integer AS '
    SELECT $1.salary * 2 AS salary;
' LANGUAGE SQL;

SELECT name, double_salary(EMP) AS dream
    FROM EMP
    WHERE EMP.cubicle ~= point '(2,1)';

 name | dream
------+-------
 Sam  |  2400

�����ιԤ���1�ĤΥե�����ɤ���Ф������ $1.salary�Ȥ�����ʸ����Ѥ��Ƥ��뤳�Ȥ����դ��Ʋ��������ޤ���ʣ���ͤȤ��ơ��ơ��֥�θ��߹����Τ�ɽ������˥ơ��֥�̾����Ѥ��� SELECT ���ޥ�ɤθƤӽФ���ˡ�ˤ����դ��Ʋ�������

ʣ�緿���֤��ؿ���������뤳�Ȥ��ǽ�Ǥ���) �ʲ��� EMP ����1���֤��ؿ�����򼨤��ޤ���

CREATE FUNCTION new_emp() RETURNS EMP AS '
    SELECT text ''None'' AS name,
        1000 AS salary,
        25 AS age,
        point ''(2,2)'' AS cubicle;
' LANGUAGE SQL;

�����Ǥϡ���°��������ǻ��ꤷ�Ƥ��ޤ��������������黻�估���֤������뤳�Ȥ�Ǥ��ޤ����������ä��ؿ�����������ǡ�2�Ĥν��פ���������ʲ��˼����ޤ���

�� (ʣ�緿) ���֤��ؿ��ϡ����Ǽ����Ȥ���ơ��֥�ؿ��Ȥ��ƻ��ѤǤ��ޤ��� ���δؿ��ϡ����ιԤ���°���� 1 �Ĥ�����Ф����硢���뤤�Ϲ����Τ�Ʊ��ʣ�緿����������¾�δؿ����Ϥ����ˤΤߡ� SQL ���Υ���ƥ����ȤǤ�ƤӽФ����Ȥ��Ǥ��ޤ����㤨�С�

SELECT (new_emp()).name;

 name
------
 None

�ѡ����������𤷤ʤ��褦�ˡ���̤��ɲä���ɬ�פ�����ޤ���

SELECT new_emp().name;
ERROR:parser:parse error at or near "."

�ޤ����ؿ�ɽ������Ѥ���°������Ф��뤳�Ȥ�Ǥ��ޤ��� ��ñ����������ȡ�attribute(table) �� table.attribute �Ȥ���ɽ����ˡ�Τɤ���Ǥ���ѤǤ���Ȥ������ȤǤ���

SELECT name(new_emp());

 name
------
 None

--
-- ����� 
--  SELECT EMP.name AS youngster FROM EMP WHERE EMP.age < 30 
-- ��Ʊ���Ǥ���
--
SELECT name(EMP) AS youngster
    FROM EMP
    WHERE age(EMP) < 30;

 youngster
-----------
 Sam

��Ԥ��̤Ȥ����֤��ؿ��λ��Ѥ��롢¾����ˡ�ϡ��ѥ�᡼���Ȥ��ƹԷ�������դ���2���ܤδؿ���������ơ��ؿ��η�̤��Ϥ����ʲ��Τ褦����ˡ�Ǥ���

CREATE FUNCTION getname(emp) RETURNS text AS
'SELECT $1.name;'
LANGUAGE SQL;

SELECT getname(new_emp());
 getname
---------
 None
(1 row)

9.2.4. SQL �ơ��֥�ؿ�

�ơ��֥�ؿ��ϡ��䤤��碌�� FROM ��ǻ��Ѥ��뤳�Ȥ��Ǥ��ޤ��� SQL ����δؿ��Ϥ��٤� FROM ��ǻ��ѤǤ��ޤ�����ʣ�緿���֤��ؿ����ä������Ǥ��� �ؿ������ܷ����֤��褦�������Ƥ����硢�ơ��֥�ؿ��� 1 �󤫤�����ơ��֥��������ޤ��� �ؿ���ʣ�緿���֤��褦�������Ƥ����硢�ơ��֥�ؿ���ʣ�緿����Τ��줾����Ф��� 1 �Ĥ����������ޤ���

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

CREATE TABLE foo (fooid int, foosubid int, fooname text);
INSERT INTO foo VALUES(1,1,'Joe');
INSERT INTO foo VALUES(1,2,'Ed');
INSERT INTO foo VALUES(2,1,'Mary');

CREATE FUNCTION getfoo(int) RETURNS foo AS '
    SELECT * FROM foo WHERE fooid = $1;
' LANGUAGE SQL;

SELECT *, upper(fooname) FROM getfoo(1) AS t1;

 fooid | foosubid | fooname | upper
-------+----------+---------+-------
     1 |        1 | Joe     | JOE
(2 rows)

�㤫��ʬ����Ȥ��ꡢ�ؿ��η�̤���ϡ��̾�Υơ��֥�����Ʊ���褦�˰������Ȥ��Ǥ��ޤ���

���δؿ��η������줿�Τ� 1 �ԤΤߤǤ��뤳�Ȥ����դ��Ƥ��������� ����� SETOF ����ꤷ�ʤ��ä�����Ǥ���

9.2.5. set ���֤� SQL �ؿ�

SQL �ؿ��� SETOF sometype ���֤��褦�������Ƥ����硢�ؿ��κǸ�� SELECT �䤤��碌�ϺǸ�ޤǼ¹Ԥ��졢���Ϥ����Ԥ� set �����ǤȤ����֤���ޤ���

���ε�ǽ��Ȥ��ˤ��̾�ؿ���ơ��֥�ؿ��Ȥ��ƸƤӽФ��ޤ��� ���ξ�硢�ؿ��ˤ�ä��֤����ƹԤϡ��䤤��碌���鸫����ơ��֥�ιԤˤʤ�ޤ��� �㤨�С��ơ��֥� foo �����Ƥ��嵭��Ʊ���Ǥ���аʲ��Τ褦�ˤʤ�ޤ���

CREATE FUNCTION getfoo(int) RETURNS setof foo AS '
    SELECT * FROM foo WHERE fooid = $1;
' LANGUAGE SQL;

SELECT * FROM getfoo(1) AS t1;

 fooid | foosubid | fooname
-------+----------+---------
     1 |        1 | Joe
     1 |        2 | Ed
(2 rows)

���ߡ�set ���֤��ؿ��� SELECT �䤤��碌���оݥꥹ����Ǥ�ƤӽФ����Ȥ��Ǥ��ޤ���SELECT �����Ȥˤ�ä���������ƹԤ��Ф���set ���֤��ؿ����ƤӽФ��졢�ؿ��η�� set �γ����Ǥ��Ф��ƽ��ϹԤ���������ޤ��� �����������ε�ǽ�ϸ��ߤǤϿ侩����Ƥ��餺������Υ�꡼���ǤϺ��������ǽ��������ޤ��� �ʲ��ϡ��оݥꥹ�Ȥ��� set ���֤��ؿ�����Ǥ���

CREATE FUNCTION listchildren(text) RETURNS SETOF text AS
'SELECT name FROM nodes WHERE parent = $1'
LANGUAGE SQL;

SELECT * FROM nodes;
   name    | parent
-----------+--------
 Top       |
 Child1    | Top
 Child2    | Top
 Child3    | Top
 SubChild1 | Child1
 SubChild2 | Child1
(6 rows)

SELECT listchildren('Top');
 listchildren
--------------
 Child1
 Child2
 Child3
(3 rows)

SELECT name, listchildren(name) FROM nodes;
  name  | listchildren
--------+--------------
 Top    | Child1
 Top    | Child2
 Top    | Child3
 Child1 | SubChild1
 Child1 | SubChild2
(5 rows)

�Ǹ�� SELECT �ˤ����ơ� Child2 ��Child3�ʤɤ����ϹԤ�ɽ������Ƥ��ʤ����� �����դ��Ʋ������� ����ϡ�listchildren �Ϥ������Ϥ��Ф��ƶ��� set ���֤�������ϹԤ���������ʤ�����Ǥ���