User entry of parameters in queries/views.

From: Andrew Maclean <a(dot)maclean(at)cas(dot)edu(dot)au>
To: pgsql-general(at)postgresql(dot)org
Subject: User entry of parameters in queries/views.
Date: 2005-12-14 00:16:28
Message-ID: 200512141116.29030.a.maclean@cas.edu.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Version of Postgresql: 8.0.4

I have created a function:

-- Function: avg_max_speed_hr(timestamp, timestamp)

-- DROP FUNCTION avg_max_speed_hr("timestamp", "timestamp");

CREATE OR REPLACE FUNCTION avg_max_speed_hr("timestamp", "timestamp")
RETURNS SETOF t_avgmaxspeedhr AS
$BODY$
SELECT date_trunc('hour',ap.absolute_time), ap.agent_id, avg(ap.speed),
max(ap.speed)
FROM agent_position AS ap
WHERE ap.absolute_time BETWEEN $1 AND $2
GROUP BY date_trunc('hour',ap.absolute_time),ap.agent_id
HAVING avg(ap.speed)>0
ORDER BY date_trunc('hour',ap.absolute_time),ap.agent_id
$BODY$
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION avg_max_speed_hr("timestamp", "timestamp") OWNER TO fleetmgt;
COMMENT ON FUNCTION avg_max_speed_hr("timestamp", "timestamp") IS 'This
function returns a table of agents, their average and maximum speeds for
hourly intervals over the time interval specified.';

Which I can access in a query like this:
SELECT * FROM avg_max_speed_hr('2005-06-16 00:00:00','2005-06-17 00:00:00 ');

This works OK.

My problem is that users are using MS Access via the ODBC link to access the
database and Postgresql functions (like avg_max_speed_hr() ) are not being
recognised.

I had assumed that I could wirte in Access something like this:
SELECT * FROM avg_max_speed_hr(StartTIme,EndTime); -- *
Where prompts for the user defined variables would appear when the query is
run.

I am only new to Postgresql so I am asking if it is possible to create a view
similar to the above query(*) that can be accessed through Access.

I can rewrite it as a query in Access e.g.
SELECT Format(ap.absolute_time,"yyyy mm dd") AS [Day],
Format(ap.absolute_time,"hh") AS [Hour], Format(ap.absolute_time,"yyyy mm dd
hh") AS TimePeriod, ap.agent_id, Avg(ap.speed) AS AvgOfspeed, Max(ap.speed)
AS MaxOfspeed
FROM public_agent_position AS ap
WHERE (((ap.absolute_time) Between [StartTime] And [EndTime]))
GROUP BY Format(ap.absolute_time,"yyyy mm dd"), Format(ap.absolute_time,"hh"),
Format(ap.absolute_time,"yyyy mm dd hh"), ap.agent_id
HAVING (((Avg(ap.speed))>0))
ORDER BY Format(ap.absolute_time,"yyyy mm dd hh"), ap.agent_id;

However this runs quite slowly and I would rather defer the processing to the
server. It also poses problems in graphing because of the group statements.

Thanks for any help.

Andrew

--
___________________________________________
Andrew J. P. Maclean
Postal:
Australian Centre for Field Robotics
The Rose Street Building J04
The University of Sydney  2006  NSW
AUSTRALIA

Room:106
Phone:+61 2 9351 3283
Fax:+61 2 9351 7474
http://www.acfr.usyd.edu.au/
___________________________________________

Browse pgsql-general by date

  From Date Subject
Next Message Douglas McNaught 2005-12-14 01:10:13 Re: "incomplete startup packet" on SGI
Previous Message John Taber 2005-12-13 23:53:11 Re: php + postgresql pg_connect problem