> Hi,
>
[quoted text clipped - 30 lines]
> immediately after before exiting the SP? - It builds and runs fine
> apart from this.
The result set of the cursor gets computed as you retrieve the data.
So when you do the delete you are affecting the query "in flight".
This is called "self hosing"
I'm taking a guess here at what you may be trying to do:
Declare return_cursor cursor with return to client for
WITH d1 AS (SELECT * FROM OLD TABLE(DELETE FROM t1 WHERE ..)),
d2 AS (SELECT * FROM OLD TABLE(DELETE FROM t2 WHERE ..)),
d3 AS (SELECT * FROM OLD TABLE(DELETE FROM t3 WHERE ..))
select * from t1, t2, t3
Cheers
Serge
PS: Prereq: DB2 V8.1.4 for LUW

Signature
Serge Rielau
DB2 Solutions Development
IBM Toronto Lab
Serge Rielau - 28 Feb 2006 21:38 GMT
> Declare return_cursor cursor with return to client for
> WITH d1 AS (SELECT * FROM OLD TABLE(DELETE FROM t1 WHERE ..)),
> d2 AS (SELECT * FROM OLD TABLE(DELETE FROM t2 WHERE ..)),
> d3 AS (SELECT * FROM OLD TABLE(DELETE FROM t3 WHERE ..))
select from d1, d2, d3
Sorry

Signature
Serge Rielau
DB2 Solutions Development
IBM Toronto Lab
PaulR - 07 Mar 2006 17:41 GMT
Serge,
This works a treat !! many thanks, I now understand your paper too :-)
PaulR - 01 Mar 2006 17:55 GMT
Serge,
Many thanks for your explanation, I was wrongly assuming the result set
was 'protected' once the cursor was opened.
This explains exactly what I am seeing.
Unfortunately, I don't understand the construct you are using with the
CTEs ?
- Do you have a pointer I can go off and read?
What the procedure is doing is using 3 Regular Tables as "temp tables"
rather than using SESSION tables.
and deleting from these temp tables at the end of the Procedure i.e
self cleaning.
- we could look at a scheduled garbaage collection instead as a
simple solution.
PS. The Procedure currently uses SESSION tables, but this incurs a
(signiifcant)compile overhead on the first
call after connection, and seems to require multiple plans in
the Package cache 1 per connection.
This is a very big/complex Procedure that is required to execute
sub-second, so we are always looking
for ways to optimise it.
Thanks.
Knut Stolze - 03 Mar 2006 07:27 GMT
> Serge,
>
[quoted text clipped - 6 lines]
> CTEs ?
> - Do you have a pointer I can go off and read?
Have a look here: http://tinyurl.com/cal57

Signature
Knut Stolze
DB2 Information Integration Development
IBM Germany
PaulR - 03 Mar 2006 10:16 GMT
Many Thanks,
Found this too - trying to absorb it into my relatively tiny head !
http://www-128.ibm.com/developerworks/db2/library/techarticle/dm-0411rielau/
s.sathyaram@googlemail.com - 03 Mar 2006 16:28 GMT
I tried to repoduce Paul Reddin's problem, but am unable to (See below)
I fail to understand why the behaviour is different.
Any clues ?
Sathyaram
create table sptest(i int,j int)
0 record(s) affected
insert into sptest values(1,1),(2,2),(3,3),(4,4)
4 record(s) affected
CREATE PROCEDURE PROC_SPTEST (in p_i int)
result sets 1
language sql
begin
begin
declare c1 cursor with return for select i,j from sptest ;
open c1 ;
end ;
delete from sptest where i=p_i ;
end
0 record(s) affected
select * from sptest
I J
---- ----
1 1
2 2
3 3
4 4
4 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
call proc_sptest(1)
I J
---- ----
1 1
2 2
3 3
4 4
4 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
select * from sptest
I J
---- ----
2 2
3 3
4 4
3 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 10/ms]
PaulR - 07 Mar 2006 17:47 GMT
Hi,
It doesn't surprise me you weren't able to re-create this ...
as in our scenario we only see the problem 'sometimes' e.g seems to
depend on how many rows are returned by the SP.
and interestingly we only ever seem to lose 1 row (but maybe that is
coincidence too).
Thanks.