Thanks for your response, Tom. I guess my question would be, what needs to change in my syntax to expect to get one row returned?
Here are a couple of examples that do work in my existing application prior to my recent computer switch and re-build (and I have well over 100 of these types of functions defined, some more complex than others, but I figured a simple example would help someone else to most easily be able to help me). -- Function: dimension.get_location_holiday(bigint) -- DROP FUNCTION dimension.get_location_holiday(bigint); CREATE OR REPLACE FUNCTION dimension.get_location_holiday(bigint) RETURNS refcursor AS $BODY$ DECLARE loc refcursor; BEGIN open loc for select * from dimension.location_holiday where holidayid = $1; return loc; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION dimension.get_location_holiday(bigint) OWNER TO postgres; GRANT EXECUTE ON FUNCTION dimension.get_location_holiday(bigint) TO public; GRANT EXECUTE ON FUNCTION dimension.get_location_holiday(bigint) TO postgres; -- Function: dimension.get_location_list(character varying, character varying, integer) -- DROP FUNCTION dimension.get_location_list(character varying, character varying, integer); CREATE OR REPLACE FUNCTION dimension.get_location_list(character varying, character varying, integer) RETURNS refcursor AS $BODY$ DECLARE loc refcursor; BEGIN IF $3 = 1 THEN open loc for select a.locationid, a.locationname, a.partnerid, b.partnername, a.phone1,a.phone2, a.fax1, a.fax2,a.physaddress1, a.physaddress2, a.physcityid, e.city||', '||e.statecode||' '||e.zipcode, a.contact1, a.contact2, a.email1, a.email2, a.activestatus, a.timezone, a.taxrate, e.statecode,a.faxflag, a.ticklerflag,case when a.ticklerflag = 't' then 'YES' else 'NO' end, e.city from dimension.location_base a, dimension.partner b, postal.us_zip e where a.partnerid = b.partnerid and a.physcityid = e.zipid and e.statecode = $2 order by a.locationname; ELSE IF $3 = 0 THEN open loc for select a.locationid, a.locationname, a.partnerid, b.partnername, a.phone1,a.phone2, a.fax1, a.fax2,a.physaddress1, a.physaddress2, a.physcityid, e.city||', '||e.statecode||' '||e.zipcode, a.contact1, a.contact2, a.email1, a.email2, a.activestatus, a.timezone, a.taxrate, e.statecode,a.faxflag, a.ticklerflag,case when a.ticklerflag = 't' then 'YES' else 'NO' end, e.city from dimension.location_base a, dimension.partner b, postal.us_zip e where a.partnerid = b.partnerid and a.physcityid = e.zipid and e.statecode = $2 and lower(a.locationname) like $1||'%' order by a.locationname; ELSE open loc for select a.locationid, a.locationname, a.partnerid, b.partnername, a.phone1,a.phone2, a.fax1, a.fax2,a.physaddress1, a.physaddress2, a.physcityid, e.city||', '||e.statecode||' '||e.zipcode, a.contact1, a.contact2, a.email1, a.email2, a.activestatus, a.timezone, a.taxrate, e.statecode,a.faxflag, a.ticklerflag,case when a.ticklerflag = 't' then 'YES' else 'NO' end, e.city from dimension.location_base a, dimension.partner b, postal.us_zip e where a.partnerid = b.partnerid and a.physcityid = e.zipid and a.partnerid = $1; END IF; END IF; return loc; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION dimension.get_location_list(character varying, character varying, integer) OWNER TO postgres; GRANT EXECUTE ON FUNCTION dimension.get_location_list(character varying, character varying, integer) TO public; GRANT EXECUTE ON FUNCTION dimension.get_location_list(character varying, character varying, integer) TO postgres; GRANT EXECUTE ON FUNCTION dimension.get_location_list(character varying, character varying, integer) TO "eMenuAdmin"; I am running my test procs from the pgAdminIII GUI. Is my syntax wrong to execute the function? If I run select test_proc1(3), I do get the correct result which is a column header (test_proc1 integer) and a value (2). So why wouldn't I get a 6-column result set when running select test_proc(2) ? My java code syntax is as follows: public Collection getLocationList(String pname, String ste, int type) { PartnerDAO ef = new PartnerDAO(); CallableStatement proc = null; Connection conn = ef.getConnection(); Collection locations = new ArrayList(); try { proc = conn.prepareCall("{ ?= call dimension.get_location_list(?,?,?) }"); proc.registerOutParameter(1, Types.OTHER); proc.setString(2, pname.toLowerCase().trim()); proc.setString(3, ste); proc.setInt(4, type); conn.setAutoCommit(false); proc.execute(); ResultSet rs = (ResultSet) proc.getObject(1); while (rs.next()) { LocationVO eRec = new LocationVO(); eRec.setLocationId(rs.getInt(1)); eRec.setLocationName(rs.getString(2)); eRec.setPartnerId(rs.getInt(3)); eRec.setPartnerName(rs.getString(4)); eRec.setPhone1(rs.getString(5)); eRec.setDbphone1(rs.getString(5)); eRec.setPhone2(rs.getString(6)); eRec.setDbphone2(rs.getString(6)); eRec.setFax1(rs.getString(7)); eRec.setDbfax1(rs.getString(7)); eRec.setFax2(rs.getString(8)); eRec.setDbfax2(rs.getString(8)); eRec.setAddress1(rs.getString(9)); eRec.setAddress2(rs.getString(10)); eRec.setCityId(rs.getInt(11)); eRec.setCityName(rs.getString(12)); eRec.setContact1(rs.getString(13)); eRec.setDbcontact1(rs.getString(13)); eRec.setContact2(rs.getString(14)); eRec.setDbcontact2(rs.getString(14)); eRec.setEmail1(rs.getString(15)); eRec.setDbemail1(rs.getString(15)); eRec.setEmail2(rs.getString(16)); eRec.setDbemail2(rs.getString(16)); eRec.setStatus(rs.getInt(17)); eRec.setDbstatus(rs.getString(17)); eRec.setTimeZone(rs.getString(18)); eRec.setTaxRate(rs.getDouble(19)); eRec.setDbtaxRate(rs.getDouble(19)); eRec.setStateCode(rs.getString(20)); eRec.setFaxFlag(Boolean.parseBoolean(rs.getString(21))); eRec.setDbfaxFlag(Boolean.parseBoolean(rs.getString(21))); eRec.setTicklerFlag(Boolean.parseBoolean(rs.getString(22))); eRec.setTicklerFlagText(rs.getString(23)); eRec.setScName(rs.getString(24)); eRec.setCopyMenuSourceId(0); locations.add(eRec); } } catch (Exception e) { e.printStackTrace(); }finally { clearResources(conn, proc); } return locations; } If I am not including something specific required to actually display a result set, can you enlighten me? How would you write a function to return a row from the test data I provided? I'm stumped. Sincerely, Vince Maxey ----- Original Message ---- From: Tom Lane <t...@sss.pgh.pa.us> To: Vince Maxey <vama...@yahoo.com> Cc: pgsql-bugs@postgresql.org Sent: Sat, November 13, 2010 1:03:46 PM Subject: Re: [BUGS] BUG #5753: Existing Functions No Longer Work "Vince Maxey" <vama...@yahoo.com> writes: > Recently I upgraded a personal application built a number of years ago, > including java, eclipse, struts and postgresql and now face an issue with > postgresql in that application functions no longer work, specfically as > related to refcursors. The original application was based on postgresql 8.4 > I believe. > ... > But when I try to call the function: select test_proc(2); I get a column > header: test_proc refcursor and the value in this column is simply: <unnamed > portal n>, where n seems to indicate how many times I have run a cursor from > the SQL window. The example you give acts exactly as I would expect, ie, it returns the generated name of a cursor. And it does so in every release back to at least 8.0, not just 9.0. So I think you've simplified your example to the point that it no longer demonstrates whatever problem you're actually having. regards, tom lane -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs