From: | Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com> |
---|---|
To: | Frank Cazabon <frank(dot)cazabon(at)gmail(dot)com>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-general(at)lists(dot)postgresql(dot)org |
Subject: | Re: Calling function from VFP changes character field to Memo |
Date: | 2022-11-15 18:58:17 |
Message-ID: | d26940aa-fe4a-8da7-5434-983e3422c418@aklaver.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 11/15/22 10:54 AM, Frank Cazabon wrote:
>
> On 15/11/2022 2:44 pm, Tom Lane wrote:
>> Frank Cazabon <frank(dot)cazabon(at)gmail(dot)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 ...
>
> I'll try the type definition and see if that helps.
>
>
--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com
From | Date | Subject | |
---|---|---|---|
Next Message | Ron | 2022-11-15 18:59:40 | Re: Calling function from VFP changes character field to Memo |
Previous Message | Frank Cazabon | 2022-11-15 18:54:15 | Re: Calling function from VFP changes character field to Memo |