From: | Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com> |
---|---|
To: | Durumdara <durumdara(at)gmail(dot)com>, Postgres General <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Variant (Untyped) parameter for function/procedure |
Date: | 2024-06-05 15:01:30 |
Message-ID: | e5e59360-4852-4854-a6e3-31adb4eb3a2e@aklaver.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 6/5/24 01:34, Durumdara wrote:
> Dear Members!
>
> As I experienced, the functions/procedures extremely depend on
> parameters (very typed).
> So if I have to restructure the input parameters, I can't modify the
> function, because I have to recreate the dependents too.
> For example:
> I have a type. If I pass this type to a function, I can't change the
> structure of the type without dropping and recreating the function.
>
> create type blahtype as (a int, b bool);
> create function blahcheck (input blahtype) ...
>
>
> If I have many dependent functions this causes that I have to drop
> (recreate) everything - just for an extra parameter. And sometimes this
> extra parameter doesn't change 10 functions, only one. But I have to
> recreate them all (without changing the body).
>
> Is there any way to use a Variant parameter?
You mean like:
https://www.postgresql.org/docs/current/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC
Examples here:
https://www.postgresql.org/docs/current/plpgsql-declarations.html#PLPGSQL-DECLARATION-PARAMETERS
Starting at:
"... When the return type of a PL/pgSQL function is declared as a
polymorphic type ..."
Or there is VARIADIC:
https://www.postgresql.org/docs/current/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS
> Like this:
>
> create procedure test(IN Input Record, OUT Output Record)
> ...
> Time = Input.Time::timestamp;
> ...
>
> Output = SomeHowMakeItTyped;
>
> Output.Result = 1;
>
> ...
>
>
> Caller:
>
> ...
> for r_in as select id, name from blah into
> ...
> test(r_in, r_out);
> if r_out.result <> 0 then ...
>
> Or:
>
> create procedure test(IN Inputs Records, OUT Output Record)
> ...
> for Input in Inputs:
> Time = Input.Time::timestamp;
> ...
> Output.Result = 1;
> ...
>
>
>
>
> Or is it impossible, because of the PGSQL's philosophy (very typed)?
>
> If it is not possible then I have one way I think.
> It is a JSON data type for inputs and outputs.
>
> Is that right?
>
> Thanks for your any help, info!
>
> Best regards
> dd
>
>
>
>
>
--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com
From | Date | Subject | |
---|---|---|---|
Next Message | Marcos Pegoraro | 2024-06-05 17:50:26 | Length returns NULL ? |
Previous Message | Gavin Roy | 2024-06-05 14:22:35 | Re: Purpose of pg_dump tar archive format? |