使用SQL查看AS400日志数据 - 特别是Entry_Data

问题描述 投票:0回答:1

我正在使用 SQL 查看 AS400 上的日记条目。一切都很好,除了字段 ENTRY_DATA 中的数据返回为

800400000000020F000000130000000000000000000000010000000700000046F0F0F0F0F0F0F00000000E0040000000000000000000000000B0F89A 7EAC380E9D

如何将其转换为有用的数据字符串?我一直在尝试铸造和创建函数以及大约 50 个其他东西...... 任何小线索将不胜感激。

还有很多其他的

SELECT
    cast(ENTRY_DATA  as varchar(2000) ccsid EBCDIC for sbcs data)
FROM TABLE (
    QSYS2.DISPLAY_JOURNAL( 'WVJRNLIB', 'WVPRDAJRN')
) AS JT
WHERE journal_entry_type in ('DL', 'PT', 'PX', 'UP')
and OBJECT LIKE Char('%ITEMMAST%' );
select
    ( CAST(ENTRY_DATA  as VARCHAR(32000) FOR BIT DATA))  As New_Column
FROM TABLE (
    QSYS2.DISPLAY_JOURNAL( 'WVJRNLIB', 'WVPRDAJRN')
) AS JT
WHERE journal_entry_type in ('DL', 'PT', 'PX', 'UP')
and OBJECT LIKE Char('%ITEMMAST%' ) ;
ibm-midrange db2-400
1个回答
0
投票

您正在寻找 INTERPRET 功能;它是在 v7.3 TR 18 中添加到操作系统中的。当与

SUBSTRING
函数一起使用时,您可以说“获取这么多字节并将其视为整数、字符、压缩十进制或分区十进制。”

可以在IBM的支持文档中找到一个很好的使用示例如何在DISPLAY_JOURNAL表函数中提取和搜索ENTRY_DATA

SELECT
-- general Info
ENTRY_TIMESTAMP, SEQUENCE_NUMBER, RECEIVER_LIBRARY, RECEIVER_NAME, journal_code, journal_entry_type, COUNT_OR_RRN,
"CURRENT_USER" AS User, (JOB_NUMBER CONCAT '/' CONCAT TRIM(JOB_USER) CONCAT '/' CONCAT JOB_NAME) as JOB,
PROGRAM_NAME, PROGRAM_LIBRARY, REFERENTIAL_CONSTRAINT, TRIGGER,
-- entry_data = ESD = Field data
INTERPRET(substring(entry_data, 1, 32) as CHAR(32) CCSID 1141) as F1, -- char
INTERPRET(substring(entry_data, 33, 130) as VARCHAR(128) CCSID 1141) as F2, -- varchar
INTERPRET(substring(entry_data, 163, 258) as NVARCHAR(128)) as F3, -- nvarchar
INTERPRET(substring(entry_data, 421, 6) as DECIMAL(11,2) ) as N1, -- decimal
INTERPRET(substring(entry_data, 427, 11) as NUMERIC(11,2) ) as N2, -- numeric
INTERPRET(substring(entry_data, 438, 4) as INTEGER) as N3 -- int
FROM TABLE (
                 QSYS2.DISPLAY_JOURNAL( 'MYDB', 'QSQJRN', OBJECT_NAME=>'VARTABLE',
                 STARTING_RECEIVER_NAME => '*CURAVLCHN',
                 OBJECT_LIBRARY=>'MYDB',
                 OBJECT_OBJTYPE=>'*FILE',
                 OBJECT_MEMBER=>'*ALL',
                 JOURNAL_ENTRY_TYPES =>'*RCD')) AS JT
where INTERPRET(substring(entry_data, 1, 32) as CHAR(32) CCSID 1141) = 'A'; -- filtering for F1 data

-----注意-----
如果将表设置为可为空的列,则任务会变得更加复杂。基本上,您必须在使用该值之前检查

NULL_VALUE_INDICATORS
列。对于每个可为空的字段,类似这样的事情(假设前 4 个可为空):

case INTERPRET(substring(NULL_VALUE_INDICATORS, 4, 1) as char(1) )
  when '0' 
    then INTERPRET(substring(entry_data, 421, 6) as DECIMAL(11,2) ) 
  else cast(NULL as decimal(11,2)) 
end as N1,

如果您的日记配置为“最小化条目特定数据”,则任务将非常复杂。您需要动态处理每个日记条目。

© www.soinside.com 2019 - 2024. All rights reserved.