Why does the exception handler not work in the following example ?
db2 => BEGIN
db2 (cont.) => DECLARE YADAMU_INSTANCE_ID VARCHAR(36);
db2 (cont.) => DECLARE FUNCTION_DEFINITION VARCHAR(256);
db2 (cont.) =>
db2 (cont.) => DECLARE CONTINUE HANDLER FOR SQLSTATE '42884' BEGIN
db2 (cont.) => SELECT LEFT(TRANSLATE ( CHAR(BIGINT(RAND() * 10000000000 )), 'abcdef123456789', '1234567890' ),8)
db2 (cont.) => CONCAT '-'
db2 (cont.) => CONCAT LEFT(TRANSLATE ( CHAR(BIGINT(RAND() * 10000000000 )), 'abcdef123456789', '1234567890' ),4)
db2 (cont.) => CONCAT '-'
db2 (cont.) => CONCAT LEFT(TRANSLATE ( CHAR(BIGINT(RAND() * 10000000000 )), 'abcdef123456789', '1234567890' ),4)
db2 (cont.) => CONCAT '-'
db2 (cont.) => CONCAT LEFT(TRANSLATE ( CHAR(BIGINT(RAND() * 10000000000 )), 'abcdef123456789', '1234567890' ),4)
db2 (cont.) => CONCAT '-'
db2 (cont.) => CONCAT LEFT(TRANSLATE ( CHAR(BIGINT(RAND() * 10000000000000 )), 'abcdef123456789', '1234567890' ),12)
db2 (cont.) => INTO YADAMU_INSTANCE_ID
db2 (cont.) => FROM SYSIBM.SYSDUMMY1;
db2 (cont.) => END;
db2 (cont.) =>
db2 (cont.) => SELECT YADAMU.YADAMU_INSTANCE_ID()
db2 (cont.) => INTO YADAMU_INSTANCE_ID
db2 (cont.) => FROM SYSIBM.SYSDUMMY1;
db2 (cont.) =>
db2 (cont.) => SET FUNCTION_DEFINITION = 'CREATE FUNCTION YADAMU.YADAMU_INSTANCE_ID() RETURNS VARCHAR(36) DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL RETURN ''' CONCAT YADAMU_INSTANCE_ID CONCAT '''';
db2 (cont.) => EXECUTE IMMEDIATE FUNCTION_DEFINITION;
db2 (cont.) => END;
db2 (cont.) => /
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0440N No authorized routine named "YADAMU_INSTANCE_ID" of type "FUNCTION"
having compatible arguments was found. LINE NUMBER=19. SQLSTATE=42884
db2 =>
Try this.
Since you recreate the function every time and don't handle the corresponding error, when the function exists, I've added the
OR REPLACE
clause to the function definition. Note the absence of;
at the end of the compound statement.