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

12.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 �Τ褦�� "�ɥå�ɽ��" ���Ѥ��ư�����°���˥����������뤳�Ȥ��Ǥ��ޤ���

12.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 �Ǥ���ɬ�פ�����ޤ���

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

SELECT clean_EMP();

 x
---
 1

12.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

12.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�Ĥν��פ���������ʲ��˼����ޤ���

PostgreSQL �θ��ߤΥ�꡼���Ǥϡ�ʣ�緿���֤��ؿ��λ��Ѥ����ǡ�˾�ޤ����ʤ����¤������Ĥ�¸�ߤ��ޤ�����ñ�ˤ����ȡ���Ԥ��֤�������ƤӽФ����������Τ���Ф����Ȥ��Ǥ��ޤ��󡣤��ιԤ���1�Ĥ�°��������Ф������̤δؿ��ˤ��Τޤ��Ϥ����򤹤�ɬ�פ�����ޤ���(�����Τ�ɽ����������硢��̣�Τʤ����ͤˤʤ�ޤ���)�ʲ�����򼨤��ޤ���

SELECT name(new_emp());

 name
------
 None

������ϡ�°��������Ф�����˴ؿ�ɽ������Ѥ��Ƥ��ޤ���������ñ����������ȡ� attribute(table) �� table.attribute �Ȥ���ɽ����ˡ�Ϥɤ���Ǥ���ѤǤ���Ȥ������ȤǤ���

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

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

�ؿ�������ͤ�°������Ф�����˴ؿ���ʸ����Ѥ��ʤ���Фʤ�ʤ���ͳ�ϡ������ơ��ؿ��ƤӽФ����ȹ�蘆�ä����ˡ��ѡ������ɥåȹ�ʸ����Ǥ��ʤ��ʤ뤳�Ȥ����Ǥ���

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

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

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

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

12.2.4. set ���֤� SQL �ؿ�

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

set ���֤��ؿ��� SELECT �䤤��碌���оݥꥹ����ǤΤ߸ƤӽФ����Ȥ��Ǥ��ޤ��� SELECT �����Ȥˤ�ä���������ƹԤ��Ф���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 ���֤�������ϹԤ���������ʤ�����Ǥ���