On 04/01/2014 06:10 PM, Bui, Michelle P wrote:

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


Then again, do you use "v_status" as a variable?  select into v_status....


Reply via email to