LLの実行環境といえばPostgreSQL
エレファントカシマシタ
taneushi
July.31.2010
taneushi
Web Engineer
since 2009
SQL は宣言型。
慣れないと複雑な処理をしずらい。
DB側でゴリゴリやらないと無理な仕様だお
でも複雑な SQL は書けないお…
PL/SQL, PL/pgSQL があるだろ…
常識的に考えて…
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;
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;
PostgreSQL なら LL 動くだろ…
常識的に考えて…
PostgreSQL で LL つかうお!
PostgreSQL
LLEvalなみに多いお!
PostgreSQL
LL Eval ( by DanKogai)
PostgreSQLの方が多いお!
LL 使い方
1.パッケージ追加(標準)
2.CREATE LANGUEAGE
CREATE LANGUEAGE plperl;
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)
Fibonacci してみる
Fibonacci with PL/Perl
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)
Fibonacci with PL/Python
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)
Fibonacci with PL/R
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);
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)
データフレームを返すと、
テーブル型でうけとれるよ。
Fibonacci with PL/Brainfuck
ないない
できませんでした。
int しか返せないっぽい。
ないない
ご清聴ありがとうございました。