SQL works but same function is confused - Mailing list pgsql-general

From Bui, Michelle P
Subject SQL works but same function is confused
Date
Msg-id 06F83FEE7BBD0049AD97C7D4159C5A6F31A9B804@XCH-PHX-101.sw.nos.boeing.com
Whole thread Raw
Responses Re: SQL works but same function is confused  (Rob Sargent <robjsargent@gmail.com>)
Re: SQL works but same function is confused  (Rob Sargent <robjsargent@gmail.com>)
Re: SQL works but same function is confused  (Adrian Klaver <adrian.klaver@aklaver.com>)
Re: SQL works but same function is confused  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-general

Hi all,

 

I have this query that when executed as a SQL statement, it works perfect! The table tools contains many records in a time series, with attributes like category but without the field status. I assign the value of status ’active’ or ‘inactive’ depending on whether the tool record exists after a certain time (number of seconds).

 

SELECT category, v_status as status, count (tool_id) AS tool_count

FROM

    (SELECT distinct category, tool_id, ‘active’ as v_status

                                  FROM tools

                                 WHERE time >= 123456

      UNION

                SELECT distinct e1.category, e1.tool_id, ‘inactive’ as v_status

                FROM tools e1

                WHERE not exists

                                (SELECT e2.category, e2.tool_id

                                FROM tools e2

                                WHERE e2.sim_time >= 123456

                                AND e2.category = e1.category

                                AND e2.tool_id = e1.tool_id)

   ) AS derived_table

GROUP BY category, Status

 

However, when I write a function to return the same result, using this SQL statement, and I declare a local variable v_status TEXT; it errors out when executed.  The key complaint is:

ERROR:  column reference "v_status" is ambiguous...

DETAIL:  It could refer to either a PL/pgSQL variable or a table column.

 

The function returns table (category, status, and tool_count) using RETURN QUERY in front of the query.

I used <<block>> before Declare section and try using block.v_status but this is not allowed (has syntax error). When I use #variable_conflict use_variable, there is no error anymore, but the resulted Status field is null. Seemed like Postgresql does not assign the v_status as we wish.

 

CREATE OR REPLACE FUNCTION get_status

RETURNS TABLE (category SMALLINT, status TEXT, tool_count BIGINT) AS

$BODY$

 

#variable_conflict use_variable

DECLARE

v_status TEXT;

BEGIN

    RETURN QUERY SELECT category, v_status as status, count (tool_id) AS tool_count

    FROM

    (SELECT distinct category, tool_id, ‘active’ as v_status

FROM tools

                                 WHERE time >= 123456

                                UNION

                SELECT distinct e1.category, e1.tool_id, ‘inactive’ as v_status

                FROM tools e1

                WHERE not exists

                                (SELECT e2.category, e2.tool_id

                                FROM tools e2

                                WHERE e2.sim_time >= 123456

                                AND e2.category = e1.category

                                AND e2.tool_id = e1.tool_id)

   ) AS derivedTable

GROUP BY category, Status;

 

END; $BODY$

LANGUAGE plpgsql;

 

 

Thanks in advance for your insight or suggestion!

 

Michelle

 

pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: simple update query stuck
Next
From: Rob Sargent
Date:
Subject: Re: SQL works but same function is confused