in reply to Re: DBI Out parameters
in thread DBI Out parameters

Functions in pl/sql only take input arguments

Don't think that's true.  At least, I've been using bind_param_inout() with pl/sql function arguments (like the :l_chime in the OP) in quite a number of cases without any problems...

Replies are listed 'Best First'.
Re^3: DBI Out parameters
by mje (Curate) on Nov 19, 2008 at 14:43 UTC

    Just to clarify what I meant. Functions in pl/sql only allow input arguments. You cannot write:

    FUNCTION fred (arg1 OUT INTEGER) RETURN integer;

    but you can write

    FUNCTION fred (arg1 IN INTEGER) RETURN integer;

    and the IN is implied anyway.

    Also, I was not saying bind_param_inout would not work on an input only parameter but it is pointless using it and may require an unnecessary overhead on input only arguments.

      You cannot write:
      FUNCTION fred (arg1 OUT INTEGER) RETURN integer;

      Yes you can... (and if you do use such output parameters, bind_param_inout is the way to bind/access them).

        You are right you can do that - I didn't know that. I use functions mostly in SQL and procedures if there is more than one parameter to return but as you say the following does work:

        use DBI; use strict; my $h = DBI->connect('dbi:Oracle:xxx','xxx','xxx'); eval {$h->do(q{drop function fred});}; my $sql = <<'EOT'; create function fred(a OUT integer) return integer as begin a := 1; return (a + 1); end; EOT $h->do($sql); my $s = $h->prepare(q{begin ? := fred(?); end;}); my $in = 1; $s->bind_param_inout(2, \$in, 100); my $res; $s->bind_param_inout(1, \$res, 100); $s->execute; print "fred=$res, a=$in\n";

        outputs fred=2, a=1

        However, I still stand by the my comment that if the parameter is an input parameter it is probably better to bind it with bind_param and not bind_param_inout.