Forum Webscript.Ru
Программирование => Perl => Тема начата: Skif от 11 Января 2007, 23:34:04
-
нелегкая судьба кинула на камни, точне на PgSQL, надо написать ряд функций и прочая.
Язык plPerl.
Суть, есть таблица(пример)
skif=> SELECT * FROM employee;
name | basesalary | bonus
--------+------------+-------
first | 9 | 3
first | 3 | 1
second | 3 | 1
(3 rows)
skif=>
Нужно написать функцию что бы при вызове
select my_func(9) from employee;
Мне бы отдало:
name | basesalary | bonus
--------+------------+-------
first | 9 | 3
или хотя бы
--------+------------+-------
first | 9 | 3
Я конечно могу оформить вида(для примера, коряво, но так на вскидку сойдет):
CREATE OR REPLACE FUNCTION test_sk0(employee) returns varchar AS $$
my ($emp) = @_;
my $res;
if ($emp->{basesalary} != 9) {
undef $res ;
}
else {
$res = "$emp->{name} - $emp->{basesalary} - $emp->{bonus}";
}
return $res;
$$ LANGUAGE plperl;
и вывод:
skif=> select test_sk0(employee.*) from employee;
test_sk0
---------------
first - 9 - 3
(3 rows)
Но это не то. В общем после всех мытарств у меня получаются выводы либо одной строкой, либо:
skif=> select test_sk0(employee.*) from employee;
test_sk0
------------------
ARRAY(0x84f677c)
(1 row)
Я конечно могу оформить вызов функции в виде
skif=> select name,test_sk0(employee.*),bonus from employee;
name | basesalary | bonus
-------+------------+-------
first | 9 | 3
(1 row)
но тогда во многом смысл этой функции теряется.
Пните меня, что я непонимаю или понимаю неправильно.
-
Решил. Вот более-менее красивый пример:
##########################################################################
CREATE TYPE sktype AS (f1 varchar, f2 varchar);
CREATE or REPLACE FUNCTION mytime5() returns sktype
AS \'
my %date = ();
my @gm = localtime();
my $year = $gm[5] + 1900;
my $mounth = $gm[4] + 1;
my $mday = $gm[3];
my $hour = $gm[2];
my $min = $gm[1];
my $sec = $gm[0];
$mounth=sprintf("%02d",$mounth);
$mday=sprintf("%02d",$mday);
$hour=sprintf("%02d",$hour);
$min=sprintf("%02d",$min);
$sec=sprintf("%02d",$sec);
$date{\'\'year\'\'}=$year;
$date{\'\'mounth\'\'}=$mounth;
$date{\'\'day\'\'}=$mday;
$date{\'\'hour\'\'}=$hour;
$date{\'\'min\'\'}=$min;
$date{\'\'sec\'\'}=$sec;
return {f1=>"$mday\\-$mounth\\-$year", f2=>"$hour\\:$min\\:$sec"};
\'
LANGUAGE \'plperl\';
##########################################################################
#skif=> select * from mytime5();
#LOG: duration: 0.796 ms statement: select * from mytime5();
# f1 | f2
#------------+----------
# 21-01-2007 | 01:35:07
##########################################################################
#skif=> create table rrr (date varchar, time varchar);
#LOG: duration: 83.407 ms statement: create table rrr (date varchar, time varchar);
#CREATE TABLE
#skif=> select * from rrr;
#LOG: duration: 0.607 ms statement: select * from rrr;
# date | time
#------------+----------
# 21-01-2007 | 01:46:53
#(1 row)
#
#skif=> insert into rrr select * from mytime5();
#LOG: duration: 5.725 ms statement: insert into rrr select * from mytime5();
#INSERT 0 1
#skif=> select * from rrr;
#LOG: duration: 0.474 ms statement: select * from rrr;
# date | time
#------------+----------
# 21-01-2007 | 01:46:53
# 21-01-2007 | 01:47:14
#(2 rows)
#
#skif=> insert into rrr select * from mytime5();
#LOG: duration: 5.735 ms statement: insert into rrr select * from mytime5();
#INSERT 0 1
#skif=> select * from rrr;
#LOG: duration: 0.473 ms statement: select * from rrr;
# date | time
#------------+----------
# 21-01-2007 | 01:46:53
# 21-01-2007 | 01:47:14
# 21-01-2007 | 01:47:19
#(3 rows)
#
#skif=> insert into rrr select * from mytime5() where f1=\'21-01-2007\';
#LOG: duration: 8.186 ms statement: insert into rrr select * from mytime5() where f1=\'21-01-2007\';
#INSERT 0 1
#skif=> select * from rrr;
#LOG: duration: 0.572 ms statement: select * from rrr;
# date | time
#------------+----------
# 21-01-2007 | 01:46:53
# 21-01-2007 | 01:47:14
# 21-01-2007 | 01:47:19
# 21-01-2007 | 01:47:56
#(4 rows)
#
#skif=> insert into rrr select * from mytime5() where f2=\'01:47:56\';
#LOG: duration: 1.603 ms statement: insert into rrr select * from mytime5() where f2=\'01:47:56\';
#INSERT 0 0
#skif=> select * from rrr;
#LOG: duration: 0.479 ms statement: select * from rrr;
# date | time
#------------+----------
# 21-01-2007 | 01:46:53
# 21-01-2007 | 01:47:14
# 21-01-2007 | 01:47:19
# 21-01-2007 | 01:47:56
#(4 rows)
#
#skif=>