On Tue, May 29, 2012 at 9:20 PM, John M. Gamble <jgam...@ripco.com> wrote:
> On Tue, May 29, 2012 7:46 am, Matthew Musgrove wrote:
>> Joel,
>> Perhaps you could explain how DBIx::Pg::CallFunction differs from
>> DBIx::ProcedureCall and why someone would choose one over the other?
>>
>> http://search.cpan.org/dist/DBIx-ProcedureCall/ProcedureCall.pm

DBIx::Pg::CallFunction works only for functions with named parameters
(=named input arguments).
I consider this a feature, as it requires the developer to use named
parameters for all functions,
which is much safer than relying on the order of arguments.
This is especially important in a Perl->PostgreSQL bridge as Perl is
more or less untyped
while PostgreSQL is strictly typed.

DBIx::ProcedureCall does not work with named parameters.
It also seems very outdated, as it claims in the manual "PostgreSQL
stored procedures do not support OUT parameters.", which is not true.

I also don't like that it exports functions and that you have to
explicitly specify which functions to use in the source code.
In my case, this will be totally dynamic, the Perl application will
have no clue of what functions the user might want to use,
that's why I use AUTOLOAD.

I guess one could try to merge the two projects, but it's too much
work for me, and I only need this for PostgreSQL.
I think it makes sense to allow a PostgreSQL-only module because of
the much simpler implementation possible
thanks to not trying to support any database.

The entire code is only ~100 lines and super-simple. This code is
simply too important for me to risk using anything
more complex than that, when it's not necessary.

>From 
>http://cpansearch.perl.org/src/THILO/DBIx-ProcedureCall-0.11/ProcedureCall/PostgreSQL.pm:
        # if there is one more arg and it is a hashref , then we use with
named parameters
        if (@_ == 1 and ref $_[0] eq 'HASH') {
                die "PostgreSQL does not support named parameters, use 
positional
parameters in your call to '$name'. \n";
        }
        # otherwise they are positional parameters

>
> Could it be that one is calling built-in functions, while the other is
> calling stored procedures? It's hard to tell from the documentation
> though. Joel, could you expand on that please?

It works with any [functions/stored procedures] with named parameters.
Most built-in postgres functions have no named arguments, such as
round(numeric), sqrt(numeric), etc. These cannot be accessed using my
module, and I cannot see why one would need to use them from Perl. If
you need them, simply make your own wrapper function with named
parameters and you can use my module.

>
>     -john
>
>
>

Reply via email to