Re: How do you execute a postgresql function from perl?

From: Tommi Maekitalo <t(dot)maekitalo(at)epgmbh(dot)de>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Re: How do you execute a postgresql function from perl?
Date: 2003-04-16 07:45:20
Message-ID: 200304160945.20829.t.maekitalo@epgmbh.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

postgresql looks for a function 'insert_data(unknown, int4, int4, int4,)', but
you declare 'insert_data(character, character, character, character)'.
Parametertypes matter.

Try
$rec_ins = $dbh->prepare("select insert_data(?,?,?,?)");
$rv = $rec_ins->execute($file_name . '',
$dev . '',
$ino . '',
$mode . '');

This should force perl to convert the parameters to character-type.

Tommi

Am Samstag, 12. April 2003 11:03 schrieb Stu Krone:
> Hi Nigel,
>
> Nope, no luck.
>
> This is the error I found:
>
> DBD::Pg::st execute failed: ERROR: Function 'insert_data(unknown, int4,
> int4, int4,)' does not exist at ./scope_db_func.pl line 100.
>
>
> I tried single quotes and double quotes.I tried putting select in front
> of the function name and not having it there. Actually the stored proc
> that I've written just does an insert and doesn't even have to return
> anything. This is an abbreviated version of the proc. As you can see,
> there's nothing special here.
>
> CREATE FUNCTION "insert_data" (character,character,character,character)
> RETURNS boolean AS ' DECLARE
> file_name ALIAS FOR $1;
> device_num ALIAS FOR $2;
> inode_num ALIAS FOR $3;
> file_mode ALIAS FOR $4;
> BEGIN
>
> insert into file_system values (max_file_id, file_name,
> device_num,inode_num, file_mode, cur_time, system_user);
>
> insert into file_time (file_id, type_cd, time, assigned_by)
> values (max_file_id, ''atime'', atime, system_user);
>
>
> RETURN FOUND;
> END;
> ' LANGUAGE 'plpgsql';
>
>
> The code to call it is just as simple.
>
>
> use DBI; # required for database access
> my $dbh=
> DBI->connect('DBI:Pg:dbname=cosmo;host=localhost;port=1776','skrone'); my
> $rec_ins = $dbh->prepare("select insert_data(?,?,?,?,?,?,?)");
>
> sub getdata
> {
> my $file_name;
> my $dev;
> my $ino;
> my $mode;
> my $rv;
>
> $inode = stat($_);
> $file_name = $File::Find::name;
> $dev = $inode->dev;
> $ino = $inode->ino;
> $mode = $inode->mode;
>
> $rv = $rec_ins->execute($file_name,
> $dev,
> $ino,
> $mode);
> }
>
>
> find(\&getdata, $input_file_path);
>
>
> $rec_ins->finish;
> $dbh->disconnect;
> exit;
>
> I've striped out most of the functionality of the code, but you can see
> my point from the DB connectivity parts. It still won't work. Everything
> looks reasonable enough, but no luck. I'm sure it has to be possible, I
> just haven't gotten it yet.
>
>
> Stu
>
> On Fri, 2003-04-11 at 15:04, Nigel J. Andrews wrote:
> > I meant to give a perl example.
> >
> > Using DBI:
> >
> > $sth = $dbh->prepare('select myfunc2(?)');
> > $rv = $sth->execute($myvar);
> > print "Number rows = ", $sth->rows, "\n";
> > while ($data = $sth->fetchrow_array) {
> > print "Data: ", $data[0], "\n";
> > }
> > $sth->finish;
> >
> > I can't remember the Pg.pm syntax, I only see that in support mode at the
> > moment so don't really pay much attention to it.
> >
> >
> > --
> > Nigel J. Andrews
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly

--
Dr. Eckhardt + Partner GmbH
http://www.epgmbh.de

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Shridhar Daithankar 2003-04-16 07:55:14 Re: Are we losing momentum?
Previous Message Shridhar Daithankar 2003-04-16 07:20:33 Re: Are we losing momentum?