Forum Webscript.Ru

Программирование => Perl => Тема начата: Skif от 11 Января 2007, 23:34:04

Название: Немного ОТ. PlPerl
Отправлено: 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)
 
но тогда во многом смысл этой функции теряется.
Пните меня, что я непонимаю или понимаю неправильно.
Название: Немного ОТ. PlPerl
Отправлено: Skif от 21 Января 2007, 02:34:28
Решил. Вот более-менее красивый пример:


##########################################################################
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=>