Re: [SQL] plpgsql exception handling

2011-03-10 Thread Uwe Bartels
Hi,
Yes, of course is this sql producing an error.
The point is, I want to trap the error and handle it. Here in this case I
set the variable l_state and l_message.

But
The function exits with an exception instead of returning. So the exception
statement does not work as I think i would.

And I don't know why.

Best...
Uwe
PS: p_id is a variable in my code which is bigger. so ignore the update
statement.


On 9 March 2011 23:08, Samuel Gendler  wrote:

> when I run 'select 1count(*) from table' in my postgres 8.4 installation, I
> get the exact same error message.  Assuming the '1count()' function does
> exist, perhaps you need to full qualify it with a schema name?
>
> It looks to me like the query you are passing to the procedure is invalid
> and is generating the error.  Perhaps the 1 in front of count(*) is a typo?
>
>
> On Wed, Mar 9, 2011 at 1:55 PM, Uwe Bartels  wrote:
>
>> Hi,
>>
>> I'm trying to run an execute with a dynamic sql command within a function.
>> I need a clean exception handling here, but my version does not work
>> somehow.
>>
>> I want to trap a possible syntax error and write the error code, error
>> message and the sql into a table.
>>
>> the function looks similar to this, I cut out the unimportant pieces.
>>
>> CREATE OR REPLACE FUNCTION report_process(p_sql text)
>>   RETURNS integer AS
>> $BODY$
>> DECLARE
>> l_state smallint;
>> l_message text;
>> BEGIN
>>
>> l_state=0;
>> begin
>> execute 'create table result_'||p_id||' as '||p_sql;
>> exception when others then
>> l_state=-3;
>> l_message:='Error executing sql sql error code: %, sql error
>> message: %, sql: %',SQLSTATE,SQLERRM,l_sql;
>> end;
>>
>> update "cache"
>> set c_date=now(), c_state=l_state, c_message=l_message
>> where c_id=p_id;
>>
>> return 0;
>> END;
>> $BODY$
>>   LANGUAGE plpgsql VOLATILE SECURITY DEFINER
>>   COST 100;
>>
>>
>> This is the error message when I call the function
>> select report_process('select 1count(*) from event_log_day'::text);
>>
>>
>> ERROR:  syntax error at or near "("
>> LINE 1: ...e table result_9 as select 1count(*) from d...
>>  ^
>> QUERY:  create table result_9 as select 1count(*) from event_log_day
>> CONTEXT:  PL/pgSQL function "report_process" line 31 at EXECUTE statement
>>
>> ** Error **
>>
>> ERROR: syntax error at or near "("
>> SQL state: 42601
>> Context: PL/pgSQL function "report_process" line 31 at EXECUTE statement
>>
>> Any help is appreciated.
>>
>> best regards,
>> Uwe
>>
>
>


Re: [SQL] plpgsql exception handling

2011-03-10 Thread Uwe Bartels
yes, p_id is a variable in my code which is bigger. so ignore the update
statement.

Uwe

On 10 March 2011 01:20, bricklen  wrote:

> On Wed, Mar 9, 2011 at 2:08 PM, Samuel Gendler
>  wrote:
> > when I run 'select 1count(*) from table' in my postgres 8.4 installation,
> I
> > get the exact same error message.  Assuming the '1count()' function does
> > exist, perhaps you need to full qualify it with a schema name?
> > It looks to me like the query you are passing to the procedure is invalid
> > and is generating the error.  Perhaps the 1 in front of count(*) is a
> typo?
>
> Also seem to be missing "p_id" from your execute statement:
>
> execute 'create table result_'|| p_id ||' as '||p_sql;
>


Re: [SQL] plpgsql exception handling

2011-03-10 Thread Samuel Gendler
On Thu, Mar 10, 2011 at 12:45 AM, Uwe Bartels  wrote:

> Hi,
> Yes, of course is this sql producing an error.
> The point is, I want to trap the error and handle it. Here in this case I
> set the variable l_state and l_message.
>


Doh!  Of course.  Sorry about that.  What happens when you explicitly catch
the 42601 sql state or the syntax_error condition instead of 'others?'


Re: [SQL] plpgsql exception handling

2011-03-10 Thread Uwe Bartels
same same.
all errors including syntax_error match to others, but I checked it again.
and the exception remains.

Uwe



On 10 March 2011 10:56, Samuel Gendler  wrote:

>
>
> On Thu, Mar 10, 2011 at 12:45 AM, Uwe Bartels wrote:
>
>> Hi,
>>
>> Yes, of course is this sql producing an error.
>> The point is, I want to trap the error and handle it. Here in this case I
>> set the variable l_state and l_message.
>>
>
>
> Doh!  Of course.  Sorry about that.  What happens when you explicitly catch
> the 42601 sql state or the syntax_error condition instead of 'others?'
>
>
>


Re: [SQL] plpgsql exception handling

2011-03-10 Thread Samuel Gendler
On Thu, Mar 10, 2011 at 2:53 AM, Uwe Bartels  wrote:

> same same.
> all errors including syntax_error match to others, but I checked it again.
> and the exception remains.
>

I'm just guessing here, but is it throwing a new exception in the exception
handler?  I realize that the exception that is getting caught at the top
level is the original exception, but maybe that's expected behaviour when an
exception handler throws a new exception - it re-throws the original?  What
happens if you simplify the exception handler down to just a really simple
log message?  There's really nothing else obviously wrong with the code you
provided, so I'm hoping it is a problem in the code that you didn't include
since nothing else makes sense.


I just executed this and it worked correctly - saw my error statement from
the exception handler:

CREATE OR REPLACE FUNCTION report_process(p_sql text)
  RETURNS integer AS
$BODY$
DECLARE
l_state smallint;
l_message text;
BEGIN

l_state=0;
begin
execute 'create table result_9 as '||p_sql;
exception when others then
l_state=-3;
raise notice 'error';
end;
return 0;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
cost 100;

# select report_process('select 1count(*) from accounts'::text);
NOTICE:  error
 report_process

  0
(1 row)


Re: [SQL] plpgsql exception handling

2011-03-10 Thread Uwe Bartels
stupid me.
I edited a function with the same name, but different parameter types and
tested with the other function.
so everything works fine.

thanks everybody for help.

best regards,
Uwe


On 10 March 2011 11:53, Uwe Bartels  wrote:

> same same.
> all errors including syntax_error match to others, but I checked it again.
> and the exception remains.
>
> Uwe
>
>
>
>
> On 10 March 2011 10:56, Samuel Gendler  wrote:
>
>>
>>
>> On Thu, Mar 10, 2011 at 12:45 AM, Uwe Bartels wrote:
>>
>>> Hi,
>>>
>>> Yes, of course is this sql producing an error.
>>> The point is, I want to trap the error and handle it. Here in this case I
>>> set the variable l_state and l_message.
>>>
>>
>>
>> Doh!  Of course.  Sorry about that.  What happens when you explicitly
>> catch the 42601 sql state or the syntax_error condition instead of 'others?'
>>
>>
>>
>