Serge Rielau wrote:
[...]
BTW: I don't think such a drop command exists b/c of circular & self
referencing complications. They need to be resolved delicately.
You can use the SYSPROC.DB2LK_DEP_OF() table function.
It's undocumented, but the arguments are self explanatory.
Thats nifty. But shouldnt it work for all kinda objects? I tried the
following:
create function tmp.test1() returns int return 3;
create function tmp.test2() returns int return values tmp.test1();
thus test2 is dependent of test1. But neither:
DB2LK_DEP_OF('F',TMP','TEST1'), DB2LK_DEP_OF('F',TMP','TEST2'), nor
using the specificname returns a row.
I noticed that DB2LK_DEP_OF invokes DB2LK_DEP_FIRST, and the part that
handles functions looks like:
SELECT 'F', T1.ROUTINESCHEMA, T1.ROUTINENAME, T2.SPECIFICNAME,
T2.DEFINER, T2.CREATE_TIME
FROM SYSCAT.ROUTINEDEP T1, SYSCAT.ROUTINES T2
WHERE T1.BTYPE = 'F'
AND T1.BSCHEMA = 'TMP'
AND T1.ROUTINESCHEMA = T2.ROUTINESCHEMA
AND T1.ROUTINENAME = T2.ROUTINENAME
;
but that join does not work because of:
SELECT ROUTINESCHEMA , ROUTINENAME
FROM SYSCAT.ROUTINEDEP
WHERE ROUTINESCHEMA = 'TMP';
ROUTINESCHEMA
ROUTINENAME
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
TMP
SQL070104223111900
1 record(s) selected.
SELECT ROUTINESCHEMA , ROUTINENAME
FROM SYSCAT.ROUTINES
WHERE ROUTINESCHEMA = 'TMP';
ROUTINESCHEMA
ROUTINENAME
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
TMP
TEST1
TMP
TEST2
That is, ROUTINENAME in SYSCAT.ROUTINES is different from ROUTINENAME
in SYSCAT.ROUTINEDEP
If the join is changed to:
SELECT 'F', T1.ROUTINESCHEMA, T1.ROUTINENAME, T2.SPECIFICNAME,
T2.DEFINER, T2.CREATE_TIME
FROM SYSCAT.ROUTINEDEP T1, SYSCAT.ROUTINES T2
WHERE T1.BTYPE = 'F'
AND T1.BSCHEMA = 'TMP'
AND T1.ROUTINESCHEMA = T2.ROUTINESCHEMA
AND T1.ROUTINENAME = T2.SPECIFICNAME
;
it seems to work:
1 ROUTINESCHEMA
ROUTINENAME
SPECIFICNAME
DEFINER
CREATE_TIME
-
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------
--------------------------
F TMP
SQL070104224459500
SQL070104224459500
DB2INST1
2007-01-04-22.44.59.521521
1 record(s) selected.
It looks like a bug, but I'm not convinced that I understand how it
should work.
[db2inst1@ft-05 ~]$ db2level
DB21085I Instance "db2inst1" uses "32" bits and DB2 code release
"SQL08026"
with level identifier "03070106".
Informational tokens are "DB2 v8.1.2.120", "s060801", "MI00163", and
FixPak
"13".
Product is installed at "/opt/IBM/db2/V8.1".
[db2inst1@ft-05 ~]$ uname -a
Linux ft-05 2.6.9-42.ELsmp #1 SMP Wed Jul 12 23:27:17 EDT 2006 i686
i686 i386 GNU/Linux
/Lennart