DB2。选择包含值的表中的所有列
我想查找表中包含任何给定记录中的值的所有列名称。DB2。选择包含值的表中的所有列
I.e包含记录值中字符串的所有列。 “%ABC%”或“%QAW%”或“%IGH%”
如果可能的话给我在DB模式中的所有表和列,所以我没有查询手动曾经表
2016-06-15
因此我进一步了解了一下,现在我可以从每个表的每一行中的每一列中获取所有值。现在我需要查看该值(v_value)是否存在于机场代码列表中。即['LAS','LAX','BIL'] 我有一张桌子上的所有机场,我想读取和排列。
我在创建该数组并获取数据时遇到了问题。 这是我到目前为止。 看那TODO的
CREATE OR REPLACE PROCEDURE "CMSDB"."TEST1"
()
LANGUAGE SQL
SPECIFIC SQL3
P1: BEGIN
DECLARE v_tabschema VARCHAR(255);
DECLARE v_tabname VARCHAR(255);
DECLARE v_colname VARCHAR(255);
DECLARE v_airport VARCHAR(255);
DECLARE v_stmt VARCHAR(3000);
DECLARE V_SQL VARCHAR(3000);
DECLARE v_value VARCHAR(255);
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE v_stmt2 STATEMENT;
DECLARE v_value_cursor CURSOR FOR v_stmt2;
DECLARE v_airport_cursor CURSOR FOR select IDX from CMSDB.AIRPORTS;
DECLARE syscat_cursor CURSOR FOR select trim(tabschema), tabname, colname from cmsdb.syscat.columns where tabname = 'ACCTGROUP' and tabschema = 'CMSDB' and TYPENAME = 'VARCHAR' and colname not in ('CHGDATE','CHGPAGE','CHGPROG','CHGTYPE','CHGUSER','CREATEDATETIME','CREATEDBYID','REC_ID');
open v_airport_cursor;
FETCH FROM v_airport_cursor INTO v_airport;
WHILE (SQLSTATE = '00000') DO
call DBMS_OUTPUT.PUT_LINE(v_airport);
-- TODO Add each value to a list, arryalist that can be used to check if the v_value is in the list.
FETCH FROM v_airport_cursor INTO v_airport;
END WHILE;
close v_airport_cursor;
OPEN syscat_cursor;
FETCH FROM syscat_cursor INTO v_tabschema, v_tabname, v_colname;
WHILE (SQLSTATE = '00000') DO
--call DBMS_OUTPUT.PUT_LINE(v_tabschema || ' ' || v_tabname || ' ' || v_colname);
SET v_stmt = 'select ' || v_colname || ' from ' || v_tabschema || '.' || v_tabname;
--call DBMS_OUTPUT.PUT_LINE(v_stmt);
PREPARE v_stmt2 FROM v_stmt;
OPEN v_value_cursor;
FETCH FROM v_value_cursor INTO v_value;
WHILE (SQLSTATE = '00000') DO
-- TODO
--IF (airportList contains v_value) THEN
--call DBMS_OUTPUT.PUT_LINE(v_value);
--END IF;
FETCH FROM v_value_cursor INTO v_value;
END WHILE;
CLOSE v_value_cursor;
FETCH FROM syscat_cursor INTO v_tabschema, v_tabname, v_colname;
END WHILE;
close syscat_cursor;
END P1
您可以使用sysibm.syscolumns
:
select colname
from sysibm.syscolumns
where tbname = 'XX' and
(name like %ABC%' or name like '%QAW%' or name like '%IGH%');
对不起,我可能没有正确解释。 我想查找所有给定记录中有值的列。 – klind
这是一个非常奇怪的请求......也许是奇怪的我见过25年的IT工作。
你这样做的原因是什么?也许你认为你需要做的,“找到具有给定值的所有列”并不是最好的方法。
话虽这么说...
你需要创建一个光标在SYSTABLES返回系统中的所有表。然后有另一个游标返回给定表中的所有列名称。一旦你有了这些,你可以建立一个动态的语句,检查给定表中的所有列,查找你正在查找的值。获取下一个表名并重新执行。显然,如果你可以缩小搜索范围到一个特定的模式,甚至限制搜索到具有特定命名模式的表/列;你会过得更好。
另一种技术,取决于您的平台和DB2版本。您可能可以将某种批量导出操作做成一组文本文件。然后使用一个工具来清理这些文本文件的内容。
嗨查尔斯..请看我更新的问题,我进一步了。 – klind
所有“包含值的列”或全部**列名*与值匹配吗? – Charles