× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



My first suggestion is one I was told a while ago in a performance class, always use real values when you can. For instance, validate and convert you dates BEFORE adding the them to the merge statement. It looks like you are injecting host language variables into your dynamic merge statement so I see no reason to perform date validation in the dynamic SQL MERGE statement.

Secondly, some date conversions will cause an error but the end results will end up being a null. For instance we use this statement a date conversion function,
<sql>
CREATE FUNCTION YYMDTODATE (
DATENUM DECIMAL(8, 0)
)
RETURNS DATE
SPECIFIC DATEUTLF14
DETERMINISTIC
CONTAINS SQL
RETURNS NULL ON NULL INPUT
NO EXTERNAL ACTION
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
DATFMT = *ISO,
COMMIT = *NONE ,
DBGVIEW = *SOURCE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX

RETURN case when datenum > 0 then
DATE ( DIGITS ( DEC ( DATENUM , 8 , 0 ) ) || '000000' )
end
;
</sql>

With this you will need to be able to handle null return values in your outer statement. It used to have error monitoring. That made the function complicated and did not perform any better (in regards to speed and job log entries).

-Matt

-----Original Message-----
From: MIDRANGE-L [mailto:midrange-l-bounces@xxxxxxxxxxxxxxxxxx] On Behalf Of Jay Vaughn
Sent: Monday, April 29, 2019 12:39 PM
To: Midrange Systems Technical Discussion <midrange-l@xxxxxxxxxxxxxxxxxx>
Subject: need to prevent sql 20226 (maximum number of stacked diagnostics areas has been exeeded)

so... i have a merge statement that is constructed dynamically from a mapping file that contains source and target columns with "user supplied" sql statements as needed for each source/target column handling.

Essentially i am left with a fairly large merge statement structured as basic merge statement... (not actual statement below - just to illustrate of the merge I'm doing)

MERGE INTO RECORDS AR
USING (VALUES (:hv_activity, :hv_description)
FOR :hv_nrows ROWS)
AS AC (ACTIVITY, DESCRIPTION)
ON (AR.ACTIVITY = AC.ACTIVITY)
WHEN MATCHED THEN UPDATE SET DESCRIPTION = AC.DESCRIPTION
WHEN NOT MATCHED THEN INSERT (ACTIVITY, DESCRIPTION)
VALUES (AC.ACTIVITY, AC.DESCRIPTION);

nonetheless, this all works great... until I throw in some "user supplied" sql that utilizes a UDF to handle data manipulation on the source date columns

I can assure you the merge statement and UDF are working correctly...
however my UDF has a "declare continue handler for sqlexception" in which I believe that once it comes across so many bad source dates and the exit handler is executed so many times, it is throwing the sql
20226 max number of stacked diagnostics areas has been exceeded, and causing my merge statement to end prematurely. Though I do not want to add "NOT ATOMIC CONTINUE ON SQLEXCEPTION" on my merge statement because I do indeed want it to terminate with exception if there is truly an error i need to know about.

The udf works great but not under this capacity... my gut is to make changes to the UDF, but not really sure that is necessary or the best place to start... below is the udf code...

Anyone got any suggestions?

create or replace function
lscnvtools/IsValidDate (i_dateField varchar(10)
,i_dateValue varchar(10)
,i_rowKey varchar(10)
,i_rowVal varchar(50)
)
returns char (1)
language sql
returns null on null input
modifies sql data
set option commit=*none, datfmt=*iso

begin

declare g_charDate date;

declare continue handler for sqlexception begin
insert into cnverr (erpgmid
,errowkey
,errowval
,ersrccol
,ermsgtxt)
values ('CNVPFSQLR'
,i_rowKey
,i_rowVal
,i_dateField concat ' ' concat i_dateValue
,'Invalid Date Value');
return 'N';
end;

if i_dateValue is null then
return 'N';
end if;

set g_charDate = Date(i_dateValue);
return 'Y';

end
--
This is the Midrange Systems Technical Discussion (MIDRANGE-L) mailing list To post a message email: MIDRANGE-L@xxxxxxxxxxxxxxxxxx To subscribe, unsubscribe, or change list options,
visit: https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.midrange.com_mailman_listinfo_midrange-2Dl&d=DwICAg&c=2S-2xx8Cum_thMfWs-kOOHQTwolPvSZ4PFLhr1wDDGs&r=wgq2KO1Tl8HswJht2RKpmz7qvL2YDU_M-VhnRH6r43I&m=JFP8XVJVceP-8al1CsSqlaVYPrhsHtXGpG2hdbOno5s&s=yy23cdD90PaVgQb_u43uK4nZ7Sx15r0xdKVEhC3mYC8&e=
or email: MIDRANGE-L-request@xxxxxxxxxxxxxxxxxx
Before posting, please take a moment to review the archives at https://urldefense.proofpoint.com/v2/url?u=https-3A__archive.midrange.com_midrange-2Dl&d=DwICAg&c=2S-2xx8Cum_thMfWs-kOOHQTwolPvSZ4PFLhr1wDDGs&r=wgq2KO1Tl8HswJht2RKpmz7qvL2YDU_M-VhnRH6r43I&m=JFP8XVJVceP-8al1CsSqlaVYPrhsHtXGpG2hdbOno5s&s=MO35nYYAcpP9FmokvFJnNc7bS-JUrUY9DsA-9qTDzdg&e=.

Please contact support@xxxxxxxxxxxx for any subscription related questions.

Help support midrange.com by shopping at amazon.com with our affiliate link: https://urldefense.proofpoint.com/v2/url?u=https-3A__amazon.midrange.com&d=DwICAg&c=2S-2xx8Cum_thMfWs-kOOHQTwolPvSZ4PFLhr1wDDGs&r=wgq2KO1Tl8HswJht2RKpmz7qvL2YDU_M-VhnRH6r43I&m=JFP8XVJVceP-8al1CsSqlaVYPrhsHtXGpG2hdbOno5s&s=X6Xs_doetdTF2iMhaffKgepNuHgxYBh0jviXF7a7oBw&e=

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.