Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

question about temp table in function

3 views
Skip to first unread message

Timothy Perrigo

unread,
Nov 16, 2004, 2:39:45 PM11/16/04
to
I'm working on a plpgsql function that creates and populates a
temporary table. I would like the function to first drop the temp
table, if it already exists. I'm not sure how to accomplish this,
though. My first inclination was to simply wrap the 'drop table'
command in an exception handling block and ignore the exception if the
table does not exist. I'm not sure what error condition to catch,
though, so rather than specifying a "WHEN" condition, I just had
something like the following:

begin
execute 'drop table my_temp';
exception
-- do nothing
end;

That didn't work; apparently the "WHEN" condition is necessary. What
condition should I be trapping for?

Is there a better way to accomplish this? I thought about querying
pg_tables, and seeing if a record exists. Would that be a better
approach?

Thanks,
Tim


---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to majo...@postgresql.org

Michael Fuhr

unread,
Nov 16, 2004, 3:11:12 PM11/16/04
to
On Tue, Nov 16, 2004 at 01:39:45PM -0600, Timothy Perrigo wrote:

> begin
> execute 'drop table my_temp';
> exception
> -- do nothing
> end;
>
> That didn't work; apparently the "WHEN" condition is necessary. What
> condition should I be trapping for?

I assume you're using one of the 8.0 betas; earlier versions of
PostgreSQL didn't have exception handling.

Appendix A of the documentation shows the conditions you can trap.
Here's a way to find out what exception you need without having to
search the entire list:

CREATE OR REPLACE FUNCTION foo() RETURNS BOOLEAN AS $$
BEGIN
DROP TABLE my_temp;
RETURN TRUE;
END;
$$ LANGUAGE plpgsql;

\set VERBOSITY verbose
SELECT foo();
ERROR: 42P01: table "my_temp" does not exist
CONTEXT: SQL statement "DROP TABLE my_temp"
PL/pgSQL function "foo" line 2 at SQL statement
LOCATION: DropErrorMsgNonExistent, utility.c:144

The error code is 42P01, which Appendix A shows as UNDEFINED TABLE.
The exception-handling block would therefore be:

BEGIN
DROP TABLE my_temp;
EXCEPTION
WHEN undefined_table THEN
NULL;
END;

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Timothy Perrigo

unread,
Nov 16, 2004, 4:54:09 PM11/16/04
to

On Nov 16, 2004, at 2:11 PM, Michael Fuhr wrote:
> \set VERBOSITY verbose
> SELECT foo();
> ERROR: 42P01: table "my_temp" does not exist
> CONTEXT: SQL statement "DROP TABLE my_temp"
> PL/pgSQL function "foo" line 2 at SQL statement
> LOCATION: DropErrorMsgNonExistent, utility.c:144
>
> The error code is 42P01, which Appendix A shows as UNDEFINED TABLE.
> The exception-handling block would therefore be:
>
> BEGIN
> DROP TABLE my_temp;
> EXCEPTION
> WHEN undefined_table THEN
> NULL;
> END;
>
> --
> Michael Fuhr
> http://www.fuhr.org/~mfuhr/
>

That's exactly what I needed. I didn't think to set the verbosity to
get the error code. Thanks!

0 new messages