Composite type within a composite type?

Started by Juan Miguel Paredesover 20 years ago2 messagesgeneral
Jump to latest
#1Juan Miguel Paredes
juan.paredes@gmail.com

Hi, folks!

Reading previous posts on returning composite types in pl/pgsql, I
still haven't found a good answer for this issue:

Let's say we create this table:

/*************************************************************************************/
CREATE TABLE "tbl_estadosoporte" (
"id" CHAR(1) NOT NULL,
"nombreestado" VARCHAR(20) NOT NULL,
CONSTRAINT "tbl_estadosoporte_pkey" PRIMARY KEY("id")
) WITH OIDS;
/*************************************************************************************/

Now, I want a pl/pgsql function returning:

a) error_code (depending on logic conditions)
b) Result set (tbl_estadosoporte%TYPE)

My first guess was:

/*************************************************************************************/
CREATE TYPE "tp_res_conestadosdisponiblessoporte" AS (
"codigoerror" VARCHAR(100),
"filas" tbl_estadosoporte /* Implicit Composite type created with table */
);
/*************************************************************************************/

But, when executing pl/pgsql function:

/*************************************************************************************/
CREATE OR REPLACE FUNCTION "conestadosdisponiblessoporte"
(estadoactual varchar) RETURNS "tp_res_conestadosdisponiblessoporte"
AS
$body$
DECLARE
res helpdesk.tp_res_conestadosdisponiblessoporte;
BEGIN
IF estadoactual = 'Abierto' THEN
SELECT INTO res.filas *
FROM tbl_estadosoporte
WHERE id NOT IN ('A','P')
ORDER BY id;

/* SOME OTHER CONDITIONS HERE... */
END IF;

res.codigoerror = 'OK'

RETURN res;

EXCEPTION
/* SOME ERROR TRAPPING */
WHEN OTHERS THEN
res.codigoerror = 'Generic error :p';
RETURN res;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
/*************************************************************************************/

(BTW, this is just a work in progress.. :D )

I got the error:

ERROR: cannot assign non-composite value to a row variable.

Couldn't find other posts regarding the above message...

Perhaps it's just a design problem... this was a T-SQL (MsSQLServer)
stored procedure, with both OUTPUT parameters and a resultset...

Any help or suggestions greatly appreciated.

Thx!!

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Juan Miguel Paredes (#1)
Re: Composite type within a composite type?

Juan Miguel Paredes <juan.paredes@gmail.com> writes:

DECLARE
res helpdesk.tp_res_conestadosdisponiblessoporte;
BEGIN
IF estadoactual = 'Abierto' THEN
SELECT INTO res.filas *
FROM tbl_estadosoporte

Without having looked at the code, I suspect that plpgsql just assumes
res.filas is of scalar type and so fails to match it up to the entire
SELECT INTO * list. (It's not obvious how to do "better" for arbitrary
combinations of scalar types, composite types, and user expectations...)

I'd recommend that you declare a row variable of type tbl_estadosoporte,
select into that, and then worry about constructing the larger composite
result.

regards, tom lane