The DB2 plugin adds DB2-specific functionality to the SQuirreL SQL Client for IBM DB2 hosted on LUW (Linux, Unix, Windows) and OS/400. Read access is required to the following system views in order for this additional functionality to work correctly on LUW DB2:
Stored Procedures, Triggers, Views and User-defined Functions (UDFs) are shown in the object tree and have a "Source" tab which displays the source of the selected object and a "Details" tab which gives DB2-specific information about the object. Tables and Materialized Query Tables are shown in the object tree and have a "Source" tab which displays the source of the selected object. Sequences and Indexes are also shown in the object tree and have a details tab giving DB2-specific information about them.
The information provided by the details tab for indexes is derived by the following query on LUW DB2:
SELECT T1.IID as index_identifier, T1.DEFINER AS index_owner, T1.INDNAME AS index_name, T2.DEFINER AS table_owner, T2.TABNAME AS table_name, T3.TBSPACE AS table_space, case T1.INDEXTYPE when 'BLOK' then 'Block Index' when 'CLUS' then 'Clustering Index' when 'DIM' then 'Dimension Block Index' when 'REG' then 'Regular Index' when 'XPTH' then 'XML Path Index' when 'XRGN' then 'XML Region Index' when 'XVIL' then 'Index over XML column (Logical)' when 'XVIP' then 'Index over XML column (Physical)' end AS index_type, case T1.UNIQUERULE when 'U' then 'UNIQUE' when 'D' then 'NON-UNIQUE' when 'I' then 'UNIQUE (Implements PK)' end AS uniqueness, T1.NLEAF AS number_of_leaf_pages, T1.NLEVELS AS number_of_levels, T1.CREATE_TIME, T1.STATS_TIME AS last_statistics_update, case T1.REVERSE_SCANS when 'Y' then 'Supported' when 'N' then 'Not Supported' end AS reverse_scans FROM SYSCAT.INDEXES AS T1, SYSCAT.TABLES AS T2, SYSCAT.TABLESPACES as T3 WHERE T3.TBSPACEID = T1.TBSPACEID and T2.TABNAME = T1.TABNAME and T2.TABSCHEMA = T1.TABSCHEMA AND T1.TABSCHEMA = ? AND T1.INDNAME = ?and the following query on OS/400 DB2:
select index_owner, index_name, index_schema, table_owner, table_name, table_schema, case is_unique when 'D' then 'No (duplicates are allowed)' when 'V' then 'Yes (duplicate NULL values are allowed)' when 'U' then 'Yes' when 'E' then 'Encoded vector index' end as uniqueness, column_count, system_index_name, system_index_schema, system_table_name, system_table_schema, long_comment, iasp_number, index_text, is_spanning_index from qsys2.sysindexes where table_schema = ? and index_name = ?
The source code for stored procedures is derived by the following query on LUW DB2:
select text from SYSCAT.PROCEDURES where PROCSCHEMA = ? and PROCNAME = ?
and the following query on OS/400 DB2:
select routine_definition from qsys2.sysroutines where routine_schema=? and routine_name = ?
The information in the details tab for a sequence is derived from the following query on LUW DB2:
SELECT T1.OWNER AS sequence_owner, T1.DEFINER AS sequence_definer, T1.SEQNAME AS sequence_name, T2.TYPENAME AS data_type, T1.MINVALUE AS min_value, T1.MAXVALUE AS max_value, T1.INCREMENT AS increment_by, case T1.CYCLE when 'Y' then 'CYCLE' else 'NOCYCLE' end AS cycle_flag, case T1.ORDER when 'Y' then 'ORDERED' else 'UNORDERED' end AS order_flag, T1.CACHE AS cache_size, T1.CREATE_TIME AS create_time, T1.ALTER_TIME AS last_alter_time, case T1.ORIGIN when 'U' then 'User' when 'S' then 'System' end AS origin, T1.REMARKS AS comment FROM SYSCAT.SEQUENCES AS T1, SYSCAT.DATATYPES AS T2 WHERE T1.DATATYPEID = T2.TYPEID and T1.SEQSCHEMA = ? and T1.SEQNAME = ?
and the following query on OS/400 DB2:
select sequence_schema, sequence_name, sequence_definer, data_type as type_name, minimum_value as min_value, maximum_value as max_value, increment as increment_by, case cycle_option when 'YES' then 'CYCLE' else 'NOCYCLE' end as cycle_flag, case order when 'YES' then 'ORDERED' else 'UNORDERED' end as order_flag, cache as cache_size, sequence_created as create_time, last_altered_timestamp as last_alter_time, long_comment as comment from qsys2.syssequences
The source code for triggers is derived from the following query:
select TEXT from SYSCAT.TRIGGERS where TABSCHEMA = ? and TRIGNAME = ?
The information in the details tab for a trigger is derived from the following query:
SELECT T1.DEFINER AS trigger_definer, T1.trigname AS trigger_name, case T1.TRIGTIME when 'A' then 'AFTER' when 'B' then 'BEFORE' when 'I' then 'INSTEAD OF' end AS trigger_time, case T1.TRIGEVENT when 'I' then 'INSERT' when 'U' then 'UPDATE' when 'D' then 'DELETE' when 'S' then 'SELECT' else T1.TRIGEVENT end AS triggering_event, T2.DEFINER AS table_definer, T2.TABNAME AS table_name, case T2.TYPE when 'T' then 'TABLE' when 'V' then 'VIEW' else T2.TYPE end AS table_type, case T1.GRANULARITY when 'R' then 'ROW' when 'S' then 'STATEMENT' else T1.GRANULARITY end AS granularity, case T1.VALID when 'Y' THEN 'VALID' when 'N' THEN 'INVALID' when 'X' THEN 'INOPERATIVE' end AS validity, T1.REMARKS comment FROM SYSCAT.TRIGGERS AS T1, SYSCAT.TABLES AS T2 WHERE T2.TABNAME = T1.TABNAME and T2.TABSCHEMA = T1.TABSCHEMA and T1.TRIGSCHEMA = ? and T1.trigname = ?
An example of MQT source is shown in the following picture:
The source code for views/MQTs is derived from the following query on LUW DB2:
SELECT TEXT FROM SYSCAT.VIEWS WHERE VIEWSCHEMA = ? AND VIEWNAME = ?and the following query on OS/400 DB2:
select view_definition from qsys2.sysviews where table_schema = ? and table_name = ?
The source code for a UDF is derived from the following query on LUW DB2:
SELECT case when body is null then 'No source available' else body end FROM SYSIBM.SYSFUNCTIONS WHERE schema = ? AND name = ? AND implementation is nulland the following query on OS/400 DB2:
select case when body = 'SQL' and routine_definition is not null then routine_definition when body = 'SQL' and routine_definition is null then 'no source available' when body = 'EXTERNAL' and external_name is not null then external_name when body = 'EXTERNAL' and external_name is null then 'system-generated function' end as definition from QSYS2.SYSFUNCS where routine_schema = ? and routine_name = ?
The information in the details tab for a UDF is derived from the following query on LUW DB2:
select name, schema, definer, function_id, parm_count, side_effects, fenced, language, contains_sql, result_cols, class, jar_id from sysibm.SYSFUNCTIONS where schema = ? and name = ?
and the following query on OS/400 DB2:
select routine_name as name, routine_schema as schema, routine_definer as definer, in_parms as parm_count, case external_action when 'E' then 'has external side effects' when 'N' then 'has no external side effects' end as side_effects, fenced, external_language as language, sql_data_access as contains_sql, number_of_results as result_cols, external_name from qsys2.SYSFUNCS where routine_schema = ? and routine_name = ?