× 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.



WARNING: This entire post can be classified in the "Doctor, it hurts when I do this", "So don't DO that!" category, but even so, it might save someone some serious pain in the future.

Somewhere between V5R4 and V7.1 DB2 got much more picky about the data in your files. This especially affects queries against multi-format physical data - that is, legacy data files defined with DDS where one or more records DON'T match the physical format of the file. Examples are files with control records (you all remember those?) or records where they have order data and comments in the same file, with the comments having a special record ID.

Anyway, the gist of the problem is this: in V5R4 you could work with those files just fine provided your select clause omitted the improperly formatted record(s). So, if I had an ID field for my ORDDET file and the ID was '01' for order detail lines and '02' for comments, I could easily do something like this:

SELECT DISTINCT ODCUST FROM ORDDET WHERE ID = '01' ORDER BY ODCUST

This would give me a nice, succinct ordered list of customer numbers in the ORDDET file. However, as of V7.1, that will fail with a "selection error" for the first type '02' record, telling me that the data in ODCUST was invalid.

Note that the WHERE ID = '01' clause omits the offending record. That's of no matter to DB2; it fails anyway. The data is bad, and it's not happy. Now, if I take the ORDER BY clause off, it works fine. So I tried this, thinking I could force the select ahead of time:

WITH T1 AS (SELECT ODCUST FROM ORDDET WHERE ID = '01')
SELECT DISTINCT ODCUST FROM T1 ORDER BY ODCUST

Uh uh. No way, dude. I still get the same problem. Interesting point is that it doesn't happen on every case I tried. I've whittled it down to this: if the field already has an access path (logical file) over it, then DB2 is fine and the statement runs. My guess is that this is because it uses the existing access path. If there is none, then the SQL engine needs to build one, and it builds it regardless of the selection criteria, and so it includes the bad record and promptly falls over.

If I create a logical by the field in question, the statements work. If I delete the logical, they fail again.

So there ya go.

Joe

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:

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.