Re: Calling function from VFP changes character field to Memo - Mailing list pgsql-general

From Frank Cazabon
Subject Re: Calling function from VFP changes character field to Memo
Date
Msg-id ee0ec151-3f0d-8eef-5dfb-ae47d1a0c695@gmail.com
Whole thread Raw
In response to Re: Calling function from VFP changes character field to Memo  (Adrian Klaver <adrian.klaver@aklaver.com>)
List pgsql-general
On 15/11/2022 2:58 pm, Adrian Klaver wrote:
> On 11/15/22 10:54 AM, Frank Cazabon wrote:
>>
>> On 15/11/2022 2:44 pm, Tom Lane wrote:
>>> Frank Cazabon <frank.cazabon@gmail.com> writes:
>>>> If however I have a function defined like this
>>>> CREATE OR REPLACE FUNCTION public.testfunction(
>>>>       )
>>>>       RETURNS TABLE
>>>>       (
>>>>           Firstname character(30)
>>>>       )
>>>>       LANGUAGE 'plpgsql'
>>>> AS $BODY$
>>>> BEGIN
>>>>       RETURN QUERY SELECT p.cFirstName FROM patients p;
>>>> END;
>>>> $BODY$;
>>>> And I call:
>>>> SELECT * FROM public.testFunction();
>>>> Then FirstName returns as a Memo field (similar to a Text field).
>>> This is mostly about whatever software stack you're using on the
>>> client side --- Memo is certainly not something Postgres knows about.
>>>
>>>> Any idea what I need to do to get it to return the character(30) type?
>>> There's no chance of getting back the "30" part with this structure,
>>> because function signatures do not carry length restrictions.
>>> What I expect is happening is that you get firstname as an
>>> unspecified-length "character" type, and something on the client
>>> side is deciding to cope with that by calling it "Memo" instead.
>>>
>>> You could perhaps work around that by defining a named composite
>>> type:
>>>
>>> create type testfunction_result as (firstname character(30), ...);
>>>
>>> create function testfunction() returns setof testfunction_result as ...
>>>
>>>             regards, tom lane
>> Thanks, so I could define the function like this - removed the (30):
>>
>> CREATE OR REPLACE FUNCTION public.testfunction(
>>       )
>>       RETURNS TABLE
>>       (
>>           Firstname character
>>       )
>>       LANGUAGE 'plpgsql'
>
> No you don't want to do that:
>
> select 'test'::char;
>  bpchar
> --------
>  t
>
> vs
>
> select 'test'::varchar;
>  varchar
> ---------
>  test
>
> Besides you missed the important part, after creating the type 
> testfunction_result:
>
> create function testfunction() returns setof testfunction_result as ...
>

Sorry about the confusion, I have got it working using the type definition.

Thanks for the help

>
>>
>> I'll try the type definition and see if that helps.
>>
>>
>
>



pgsql-general by date:

Previous
From: Frank Cazabon
Date:
Subject: Re: Calling function from VFP changes character field to Memo
Next
From: Preston Hagar
Date:
Subject: Toast Tables, pg_repack, and AWS RDS