1 of 29

LLの実行環境といえばPostgreSQL

エレファントカシマシタ

taneushi

July.31.2010

2 of 29

taneushi

Web Engineer

since 2009

3 of 29

SQL は宣言型。

    

慣れないと複雑な処理をしずらい。

4 of 29

DB側でゴリゴリやらないと無理な仕様だお

でも複雑な SQL は書けないお…

5 of 29

PL/SQL, PL/pgSQL があるだろ…

常識的に考えて…

6 of 29

PL/SQL

DECLARE

    /* Declarative section:

       variables, types, and local subprograms. */

BEGIN

    /* Executable section: 

       procedural and SQL statements go here. */                    

    /* This is the only section of the block that is required. */

EXCEPTION

    /* Exception handling section: 

       error handling statements go here. */

END;

7 of 29

PL/SQL

DECLARE

    /* Declarative section:

       variables, types, and local subprograms. */

BEGIN

    /* Executable section: 

       procedural and SQL statements go here. */                    

    /* This is the only section of the block that is required. */

EXCEPTION

    /* Exception handling section: 

       error handling statements go here. */

END;

8 of 29

PostgreSQL なら LL 動くだろ…

常識的に考えて…

9 of 29

PostgreSQL で LL つかうお!

10 of 29

PostgreSQL

  • PL/sh
  • PL/Perl
  • PL/Perl6
  • PL/Python
  • PL/Ruby
  • PL/PHP
  • PL/Lua
  • PL/Tcl
  • PL/Java
  • PL/R
  • PL/JS(Spidermonkey)
  • PL/V8JS
  • PL/Scheme
  • PL/LOLCODE
  • PL/Brainf*ck
  • PL/pgSQL
  • PL/Proxy

11 of 29

LLEvalなみに多いお!

12 of 29

PostgreSQL

  • PL/sh
  • PL/Perl
  • PL/Perl6
  • PL/Python
  • PL/Ruby
  • PL/PHP
  • PL/Lua
  • PL/Tcl
  • PL/Java
  • PL/R
  • PL/JS(Spidermonkey)
  • PL/V8JS
  • PL/Scheme
  • PL/LOLCODE
  • PL/Brainf*ck
  • PL/pgSQL
  • PL/Proxy

LL Eval ( by DanKogai)

  • BASIC(bwbasic)
  • Emacs Lisp
  • Haskell
  • io
  • js
  • Common Lisp(ecl)
  • Lua
  • OCaml
  • perl5
  • perl6
  • php
  • ghostscript
  • Python
  • Ruby
  • Scheme
  • Tcl

 

13 of 29

PostgreSQLの方が多いお!

14 of 29

LL 使い方

15 of 29

1.パッケージ追加(標準)

  • バイナリの人
    • サブパッケージから追加
      • yum とか apt とか
      • Windowsならインストールオプション
  •  ソースの人
    • configure で追加

16 of 29

2.CREATE LANGUEAGE

CREATE LANGUEAGE plperl;

17 of 29

3.CREATE FUNCTION

CREATE FUNCTION pl_big(int4, int4) RETURNS int4 AS $$

  return $_[0] if ( $_[0] > $_[1] );

  return $_[1];

$$ LANGUAGE plperl;

SELECT pl_big(2,3);

 pl_big 

--------

      3

(1 row)

18 of 29

Fibonacci してみる

19 of 29

Fibonacci with PL/Perl

20 of 29

CREATE FUNCTION pl_fibonacci(int4) RETURNS _int4 AS $$

  sub fib {

    my $n = $_[0];

    return 1 if ($n < 2);

    return &fib($n-2) + &fib($n-1);

  }

  my ($n) = (@_);

  my @ary;

  push(@ary, &fib($_)) for (0..$n);

  return [@ary];

$$ LANGUAGE plperl;

SELECT pl_fibonacci(10);

         pl_fibonacci         

------------------------------

 {1,1,2,3,5,8,13,21,34,55}

(1 row)

21 of 29

Fibonacci with PL/Python

22 of 29

CREATE FUNCTION py_fibonacci(int4) RETURNS text AS $$

  def fib(n):

    return 1 if n < 2 else fib(n-2) + fib(n-1)

  n = args[0];

  list = []

  for i in range(0, args[0]):

    list.append(str(fib(i)))

  return ','.join(list)

$$ LANGUAGE plpythonu;

SELECT pl_fibonacci(10);

         py_fibonacci         

------------------------------

 1,1,2,3,5,8,13,21,34,55

(1 row)

23 of 29

Fibonacci with PL/R

24 of 29

CREATE TABLE fib (index int4, value int4);

CREATE FUNCTION r_fibonacci(int4) RETURNS SETOF fib AS $$

  idx <- c(1:arg1)

  val <- c()

  for (i in 1:arg1) {

    if (i < 3) val[i] <- 1

    else val[i] <- val[i-1] + val[i-2]

  }

  df <- data.frame(index = idx, value = val)  

  return(df)

$$ LANGUAGE plr;

SELECT r_fibonacci(10);

25 of 29

CREATE TABLE fib (index int4, value int4);

CREATE FUNCTION r_fibonacci(int4) RETURNS SETOF fib AS $$

  idx <- c(1:arg1)

  val <- c()

  for (i in 1:arg1) {

    if (i < 3) val[i] <- 1

    else val[i] <- val[i-1] + val[i-2]

  }

  df <- data.frame(index = idx, value = val)  

  return(df)

$$ LANGUAGE plr;

SELECT r_fibonacci(10);

 index | value 

-------+-------

     1 |   1

     2 |   1

     3 |   2

     4 |   3

     5 |   5

     6 |   8

     7 |  13

     8 |  21

     9 |  34

    10 |  55

(10 rows)

データフレームを返すと、

テーブル型でうけとれるよ。

26 of 29

Fibonacci with PL/Brainfuck

27 of 29

ないない

28 of 29

できませんでした。

int しか返せないっぽい。

ないない

29 of 29

ご清聴ありがとうございました。