Re: NO DATA FOUND Exception - Mailing list pgsql-sql

From Bart Degryse
Subject Re: NO DATA FOUND Exception
Date
Msg-id 468140AB.A3DD.0030.0@indicator.be
Whole thread Raw
In response to Re: NO DATA FOUND Exception  ("Fernando Hevia" <fhevia@ip-tel.com.ar>)
Responses Re: NO DATA FOUND Exception  ("Fernando Hevia" <fhevia@ip-tel.com.ar>)
List pgsql-sql
In case you would like to use set returning functions...
 
if your function will return records with the same structure as an existing table
CREATE FUNCTION my_func() RETURNS SETOF my_table AS ...
 
if not you have to define the returning type
CREATE TYPE func_row AS ("field1" varchar(10), "field2" integer, "field3" integer, ...)
CREATE FUNCTION my_func() RETURNS SETOF func_row AS ...

now you can use your function
SELECT * FROM my_func();
 
or
 
SELECT A.field1, A.field2
FROM my_func() A left join my_func() B on A.field2 = B.field3
WHERE A.field1 like 'B%';


>>> "Fernando Hevia" <fhevia@ip-tel.com.ar> 2007-06-26 16:25 >>>

On Jun 25, 2007, at 17:05, Michael Glaesemann wrote:

>[Please create a new message to post about a new topic, rather than 
>replying to and changing the subject of a previous message. This will 
>allow mail clients which understand the References: header to 
>properly thread replies.]

Wasn't aware of this. Will do.
I should obtain a better mail client.

>However, it looks like you're trying to return a set of results 
>(i.e., many rows), rather than just a single row. You'll want to look 
>at set returning functions. One approach (probably not the best) 
>would be to expand p_line into all of the possible v_search items and 
>append that to your query, which would look something like:

Thank you for your help. All the advice was very useful and I have now a
working function.
I still have an issue left: I would like my function to return multiple
values (as in columns of a row).
Actually I found two possibilities: array and record. I ended up using
arrays since I couldn't figure out how to access the record data from
outside the function. Nevertheless I think a solution based on returning a
record type when you actually want to return the whole row would be more
elegant.

For example:

CREATE TABLE table1 (
   field1 text,
   field2 text,
   field3 text
);

INSERT INTO table1 ('data1', 'data2', 'data3');

CREATE FUNCTION my_func() RETURNS record AS
$body$
DECLARE
  v_row table1%ROWTYPE;
BEGIN

  SELECT *
  INTO v_row
  FROM table1
  WHERE <condition> ;

  IF FOUND THEN
     RETURN v_row;
  END IF;

  RETURN NULL;

END;
$body$
LANGUAGE 'plpgsql';


SELECT my_func();
                  my_func
---------------------------------------------------
(data1, data2, data3)

How do I refer a specific field of the returned row from outside the
function? How should I write the query in order to show only fields 1 and 3,
for example?

It's sad to bother with this syntax questions, but I've had a hard time
finding code examples online.

Regards,
Fernando.


---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at

                http://www.postgresql.org/about/donate

pgsql-sql by date:

Previous
From: "Fernando Hevia"
Date:
Subject: Re: NO DATA FOUND Exception
Next
From: "Fernando Hevia"
Date:
Subject: Re: NO DATA FOUND Exception