Thread: casting parameters to a function

casting parameters to a function

From
"Chris Ochs"
Date:
I am trying to move all of the sql statements from my code into a pl/pgsql
function.  I have one function for a transaction block that contains 10
inserts and I need to pass 50 parameters to it.

Well I can't do that, so I was playing around with passing the parameters in
as a varchar[] array, but then I have the issue of the variables being the
wrong type when I insert them.

I was playing around with trying to convert types, but it isn't working so
far.  The function takes a single varchar[] as an argument..

This doesn't work:
s ALIAS FOR $1;
in_trans_date timestamp := s[3];

and this doesn't work either:
in_trans_date timestamp := $1[3];

Can someone help me in how to assign an array element to a variable and cast
it?


Re: casting parameters to a function

From
"Chris Ochs"
Date:
I finally figured out that you cannot assign parameters to a variable in the
DECLARE section, it has to be done inside the BEGIN/END block.  except for
the ALIAS command it seems that parameters do not exist in the DECLARE
block.




> I am trying to move all of the sql statements from my code into a pl/pgsql
> function.  I have one function for a transaction block that contains 10
> inserts and I need to pass 50 parameters to it.
>
> Well I can't do that, so I was playing around with passing the parameters
in
> as a varchar[] array, but then I have the issue of the variables being the
> wrong type when I insert them.
>
> I was playing around with trying to convert types, but it isn't working so
> far.  The function takes a single varchar[] as an argument..
>
> This doesn't work:
> s ALIAS FOR $1;
> in_trans_date timestamp := s[3];
>
> and this doesn't work either:
> in_trans_date timestamp := $1[3];
>
> Can someone help me in how to assign an array element to a variable and
cast
> it?
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend
>


Re: casting parameters to a function

From
Tom Lane
Date:
"Chris Ochs" <chris@paymentonline.com> writes:
> I was playing around with trying to convert types, but it isn't working so
> far.  The function takes a single varchar[] as an argument..

> This doesn't work:
> s ALIAS FOR $1;
> in_trans_date timestamp := s[3];

> and this doesn't work either:
> in_trans_date timestamp := $1[3];

These should work, and do work in CVS tip, but in 7.4 and before you'll
need to do the assignment separately from the variable declaration, eg

    DECLARE
      s ALIAS FOR $1;
      in_trans_date timestamp;
    BEGIN
      in_trans_date := s[3];
      ...

PITA, I know, but the previous coding didn't allow any variable
references in initialization expressions.  If it really bugs you
you could drop the CVS-tip version of src/pl/plpgsql/src/gram.y
into 7.4 to get the fix:

2003-12-22 19:01  tgl

    * src/pl/plpgsql/src/gram.y: Allow plpgsql variables' default value
    expressions to reference existing variables (such as function
    parameters).  Per gripe from David Fetter.

            regards, tom lane