On 2/13/2019 7:26 AM, Rob Berendt wrote:
My question then becomes "Is it possible to make a general UDTF to wrap around qsys2.DISPLAY_JOURNAL_ENTRY_INFO?".
I took a stab at an all-SQL solution (auditors are happy) and ended up
using a pipelined function. It has one tremendous disadvantage: one
needs to declare the columns of the returned table in advance. So... not
generic. The good news is that one can specify a subset of columns; it
doesn't need to be every column in the journalled table.
I post it in the hopes that someone else will get an aha!
create or replace function opensource.dspjrndta (
journal_lib_in char(10),
journal_name_in char(10),
table_lib_in char(128),
table_name_in char(128),
table_mbr_in char(10),
user_name_in char(10)
)
returns table (
sequence_number int,
journal_code char(10),
program_name char(10),
program_library char(10),
receiver_name char(10),
receiver_library char(10),
rs_col1 char(3),
rs_col2 char(9),
rs_col3 char(3),
rs_col4 char(24),
rs_col5 char(27)
-- ...
)
deterministic
modifies sql data
set option commit = *NONE
--
begin
declare journal_code char(10);
declare receiver_name char(10);
declare receiver_library char(10);
declare sequence_number int;
declare rs RESULT_SET_LOCATOR varying;
declare rs_col1 char(3);
declare rs_col2 char(9);
declare rs_col3 char(3);
declare rs_col4 char(24);
declare rs_col5 char(27);
-- cursor of journal entries
for je cursor for
SELECT X.*
FROM TABLE (
QSYS2.Display_Journal(
journal_lib_in, journal_name_in,
OBJECT_LIBRARY=>table_lib_in, OBJECT_NAME=>table_name_in,
OBJECT_OBJTYPE=>'*FILE', OBJECT_MEMBER=>table_mbr_in
) ) AS X
WHERE journal_entry_type in ('DL', 'PT', 'PX', 'UP')
AND "CURRENT_USER" = user_name_in
ORDER BY entry_timestamp DESC
for read only
do
-- 'translate' the entry_data into a row
call qsys2.display_journal_entry_info(2,
journal_lib_in,
journal_name_in,
sequence_number,
receiver_library,
receiver_name,
journal_code
);
associate result set locators (rs)
with procedure qsys2.display_journal_entry_info;
allocate jedetails cursor for result set rs;
-- each column needs to be specified here, and declared
-- above, in the 'return table' clause, and also
-- each one needs to be declared the proper type and size, too.
fetch jedetails into rs_col1, rs_col2, rs_col3, rs_col4, rs_col5;
pipe(sequence_number, journal_code, program_name, program_library,
receiver_name, receiver_library,
rs_col1, rs_col2, rs_col3, rs_col4, rs_col5);
close jedetails;
end for;
return;
--
end;
As an Amazon Associate we earn from qualifying purchases.