为什么Kingbase数据库12.1版本逆向解析时字段明细出错?

Viewed 26

由于系统自带的元数据查询模板适配的Kingbase的版本较低,而相同数据库不同的版本之前元数据的存储已经查询语法有差异,导致在高版本的可能无法正确的执行查询,如下图:

image.png

可尝试采用下方兼容查询模板(复制下方的的模板替换原有的数据库模板):

35a960d4-1e77-4bb9-b342-e72d98f36a30.png

兼容模板:

SELECT
    col.table_schema AS schema_name,
    col.TABLE_NAME AS tbl_def_key,
    col.ordinal_position AS order_value,
    col.COLUMN_NAME AS def_key,
    d.description AS def_name,
		'' AS intro,
        CASE 
    	  WHEN col.DATA_TYPE = 'USER-DEFINED' 
    	    THEN regexp_replace(col.COLUMN_TYPE, '\(\d+\)$', '')
    	  ELSE col.DATA_TYPE
    	  END AS db_data_type,
		CASE WHEN col.character_maximum_length IS NULL AND col.numeric_precision IS NOT NULL THEN col.numeric_precision::bigint 
		     ELSE col.character_maximum_length
		END AS data_len,
		CASE WHEN col.numeric_precision IS NOT NULL THEN (CASE WHEN col.numeric_scale = 0 THEN NULL ELSE col.numeric_scale END)
				ELSE NULL 
		END AS num_scale,
    CASE WHEN kc.column_name IS NOT NULL THEN 1 ELSE 0 END AS primary_key,
    CASE WHEN col.IS_NULLABLE = 'NO' THEN 1 ELSE 0 END AS not_null,
    CASE WHEN col.COLUMN_DEFAULT LIKE 'nextval%' THEN 1 ELSE 0 END AS auto_increment,
	--	substr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type))) AS default_value
	CASE
        WHEN strpos(col.column_default, concat('::',col.data_type)) = 0 THEN (CASE
                                                                                  WHEN col.column_default LIKE 'nextval%' THEN ''
                                                                                  ELSE col.column_default
            END)
        ELSE substr(col.column_default,0,strpos(col.column_default, concat('::',col.data_type))-1)
        END AS default_value
FROM
    information_schema.COLUMNS col LEFT JOIN (information_schema.key_column_usage kc JOIN information_schema.table_constraints tc 
																								ON 
																											kc.constraint_name = tc.constraint_name 
																									and tc.constraint_type = 'PRIMARY KEY'
																									and kc.table_schema=tc.table_schema 
																									and kc.table_name=tc.table_name  --25.1.11 tc.table_schema
																					) ON 
																								col.TABLE_NAME = kc.table_name 
																						AND col.COLUMN_NAME = kc.column_name
																						 AND col.table_schema=kc.table_schema --25.1.11
LEFT JOIN pg_class C ON C.relname = col.TABLE_NAME
JOIN pg_namespace n ON col.table_schema = n.nspname AND c.relnamespace = n.oid
LEFT JOIN pg_description d ON d.objoid = C.oid AND d.objsubid = col.ordinal_position
WHERE
    col.table_schema IN (:schemaName)
    AND CONCAT(TRIM(col.table_schema), '.', TRIM(col.TABLE_NAME)) IN (:sysTableNames)
    AND col.table_schema IN (:schemaName)
ORDER BY
	col.table_schema, col.TABLE_NAME asc,col.ordinal_position ASC
0 Answers