[英]how can I print details (table name, column name, data type) of each column/table in my db2 database?
In my previous question Mark suggested a good answer for displaying count on every table in my database. 在我之前的问题中,Mark 提出了一个很好的答案,用于在我的数据库中的每个表上显示计数。 I would like to expand this procedure and - instead of counts - display the specific info (TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE) about each column in the database.我想扩展这个过程并且——而不是计数——显示关于数据库中每一列的特定信息(TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME、DATA_TYPE)。
I so far have the following command:到目前为止,我有以下命令:
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION EXPORT_SCHEMAS()
RETURNS TABLE (P_TABSCHEMA VARCHAR(128), P_TABNAME VARCHAR(128), P_COLUM_NNAME VARCHAR(128), P_DATA_TYPE VARCHAR(128))
BEGIN
DECLARE L_STMT VARCHAR(256);
DECLARE L_ROWS VARCHAR(256);
FOR V1 AS
SELECT TABSCHEMA, TABNAME
FROM SYSCAT.TABLES
WHERE TYPE = 'T'
ORDER BY 1,2
DO
SET L_STMT = 'SET ? = (SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM SYSIBM.COLUMNS where TABLE_NAME = "'||V1.TABNAME||'" AND TABLE_SCHEMA = "'||V1.TABSCHEMA||'")';
PREPARE S FROM L_STMT;
EXECUTE S INTO L_ROWS;
PIPE(L_ROWS);
END FOR;
RETURN;
END@
SELECT * FROM TABLE(EXPORT_SCHEMAS())@
but now when I run it:但现在当我运行它时:
db2 -ntd~ -f export_schemas.sql > dump.csv
I'm getting the error:我收到错误:
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL20019N The result type returned from the function body cannot be assigned
to the data type defined in the RETURNS clause. LINE NUMBER=17.
SQLSTATE=42866
Could you please help me and let me know what is wrong here and how could I fix it?你能帮我,让我知道这里出了什么问题,我该如何解决? Thanks!谢谢!
If you use Db2 for LUW, then you shouldn't use SYSIBM
schema in your queries on the system catalog.如果将 Db2 用于 LUW,则不应在系统目录的查询中使用SYSIBM
模式。 Use SYSCAT
instead.请改用SYSCAT
。
You don't have to use any functions to get what you want here.您不必使用任何函数来获得您想要的内容。 Use the following query instead:请改用以下查询:
SELECT TABSCHEMA, TABNAME, COLNAME, TYPENAME
FROM SYSCAT.COLUMNS
ORDER BY TABSCHEMA, TABNAME, COLNO;
As for your routine.至于你的日常。 There is a number of errors in the text.文中有很多错误。
1) if you want to assign multiple values with SET
statement, you must use the corresponding number of parameter markers in the statement: 1)如果要使用SET
语句赋值多个值,必须在语句中使用相应数量的参数标记:
SET (?, ..., ?) = (SELECT COL1, ..., COLn FROM ...);
PREPARE S FROM L_STMT;
EXECUTE S INTO L_V1, ..., L_Vn;
2) RETURNS TABLE (...)
and PIPE(...)
must have the same number of columns 2) RETURNS TABLE (...)
和PIPE(...)
的列数必须相同
You could directly query the tables SYSCAT.COLUMNS and SYSCAT.TABLES .您可以直接查询SYSCAT.COLUMNS和SYSCAT.TABLES表。 The following returns the table schema and name followed by column name and their type.以下返回表架构和名称,后跟列名及其类型。 Column info is sorted by the column order:列信息按列顺序排序:
select t.tabschema, t.tabname, c.colname, c.typename, c.colno
from syscat.columns c, syscat.tables t
where t.type='T' and t.tabname=c.tabname and t.tabschema=c.tabschema
order by 1,2,c.colno
BTW: Db2 has a tool db2look to export schema information.顺便说一句:Db2 有一个工具db2look来导出模式信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.