So what new things can we do with functions in DB2 12 for z/OS?
The ARRAY_AGG function can be used to build an array from table data. It returns an array in which each value of the input set is assigned to an element of the array. So basically speaking, you can use ARRAY_AGG to read values from rows of a table and convert those values into an array. For example, if I wanted to create an array of name from the EMP table for all females employees I could write it like this:
SET ARRAYNAME = (SELECT LASTNAME FROM DSN8C10.EMP WHERE SEX = 'F');
The new part is the ability to use an associative array aggregation. That means that the ARRAY_AGG function is invoked where there is a target user-defined array data type in the same statement, or the result of the ARRAY_AGG function is explicitly cast to a user-defined array data type.
More details can be found here.
Another new capability comes with the LISTAGG function, which is only available as of function level 501. The LISTAGG function aggregates a set of string values for a group into
one string by appending the string-expression values based on the order that is specified in the WITHIN GROUP clause.
So if I needed to create a list of comma-separated names, in alphabetical order grouped by department I could write:
SELECT WORKDEPT,
LISTAGG(LASTNAME, ’, ’) WITHIN GROUP(ORDER BY LASTNAME)
AS EMPLOYEES
FROM DSN8C10.EMP
GROUP BY WORKDEPT;
You can find additional details here.
DB2 12 for z/OS also adds functions for calculating the percentile of a set of values. There are two options:
- PERCENTILE_CONT
- PERCENTILE_DISC
On the other hand, the PERCENTILE_DISC function returns a percentile of a set of values treated as discrete values. The calculated percentile is always a value that appeared in the input set.
Consider the following two statements:
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY COMM),
FROM DSN8C10.EMP
WHERE WORKDEPT = 'E21';
The result here, using the sample data, would be 1968.50. There are an even number of rows, so the percentile using the PERCENTILE_CONT function would be determined by interpolation. The average of the value of the two middle rows (1907.00 and 2030.00) is used.
SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY COMM),
FROM EMPLOYEE
WHERE WORKDEPT = 'E21';
The same SQL statement but substituting PERCENTILE_DISC for PERCENTILE_CONT would return 1907.00. Again, the example would return 6 rows (an even number) but instead of an average a discrete value is returned; the value of the first of the two middle rows, which is 1907.00.
Another set of new functions give the ability to generate unique values that can be used for keys:
- GENERATE_UNIQUE
- GENERATE_UNIQUE_BINARY
For GENERATE_UNIQUE a bit data character string 13 bytes long is returned. That means CHAR(13) FOR BIT DATA.
For GENERATE_UNIQUE_BINARY a BINARY(16) value is returned. Both functions require parentheses without any arguments.
The general idea behind wrapping procedural database objects is to encode a readable data definition statement such that its contents are not easily identified. The procedural logic and embedded SQL statements in an obfuscated data definition statement are scrambled in such a way that any intellectual property in the logic cannot be easily extracted.
A related system stored procedure, CREATE_WRAPPED, is also provided that can be used to obfuscate a readable data definition statement and deploy it in the database.
Summary
The general advice for every release of DB2 holds for DB2 12: always read through the manuals to find the new functions that can be used to minimize the amount of programming and work that needs to be done. It is important for both DBAs (in order to give good advice and be able to review SQL) and programmers (in order to write efficient and effective SQL) to know what functions are available. Be sure to review the new BIFs in DB2 12 and test them out to see how they work and where they can best be used at your shop!
Finally, there are a series of new functions for returning hashes. Given an expression, a hash algorithm is applied and the hash value is returned. There are four options:
- HASH_CRC32
- HASH_MD5
- HASH_SHA1
- HASH_SHA256
The name of the function determines the hashing algorithm that is used and the data type of the result, as shown in the table below:
BIF | Algorithm | Data Type | ||
---|---|---|---|---|
HASH_CRC32 | CRC32 | BINARY(4) | ||
HASH_MD5 | MD5 | BINARY(16) | ||
HASH_SHA1 | SHA1 | BINARY(20) | ||
HASH_SHA156 | SHA256 | BINARY(32) |
Summary
The general advice for every release of DB2 holds for DB2 12: always read through the manuals to find the new functions that can be used to minimize the amount of programming and work that needs to be done. It is important for both DBAs (in order to give good advice and be able to review SQL) and programmers (in order to write efficient and effective SQL) to know what functions are available. Be sure to review the new BIFs in DB2 12 and test them out to see how they work and where they can best be used at your shop!