Автор Тема: Немного ОТ. PlPerl  (Прочитано 2807 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Немного ОТ. PlPerl
« : 11 Января 2007, 23:34:04 »
нелегкая судьба кинула на камни, точне на PgSQL, надо написать ряд функций и прочая.
Язык plPerl.
Суть, есть таблица(пример)

skif
=> SELECT FROM employee;
  
name  basesalary bonus
--------+------------+-------
 
first  |          |     3
 first  
|          |     1
 second 
|          |     1
(3 rows)

skif=>


Нужно написать функцию что бы при вызове


select my_func
(9from  employee;

Мне бы отдало:

  name  
basesalary bonus
--------+------------+-------
 
first  |          |     3

или хотя бы

--------+------------+-------
 
first  |          |     3


Я конечно могу оформить вида(для примера, коряво, но так на вскидку сойдет):

CREATE 
OR REPLACE FUNCTION test_sk0(employeereturns 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 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 |          |     3
(1 row)

но тогда во многом смысл этой функции теряется.
Пните меня, что я непонимаю или понимаю неправильно.
Всё будет хорошо - я договорился!

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Немного ОТ. PlPerl
« Ответ #1 : 21 Января 2007, 02:34:28 »
Решил. Вот более-менее красивый пример:


##########################################################################
CREATE TYPE sktype AS (f1 varcharf2 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=>
Всё будет хорошо - я договорился!

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28