db2 输出实际长度小于指定长度的字符串的存储过程

inb24sb2  于 2023-01-13  发布在  DB2
关注(0)|答案(1)|浏览(240)

给定表的存储过程输出类型为CHARVARCHAR的列的列表,这些列的实际内容长度小于列的长度,并输出实际内容长度小于列长度的程度。
示例:
| 色谱柱名称|色谱柱类型|色谱柱长度|未使用_长度|
| - ------|- ------|- ------|- ------|
| 栏1|瓦尔查尔|六十|四个|
此示例显示column1的最大实际长度为56个字符,即声明的60个字符未完全使用。如果列的长度已完全使用,则不必显示此列。此外,此过程应将结果返回到屏幕,而不是由后续的SELECT手动运行返回。
此查询可以获取有关表的列的数据:

select 
    t2.COLNAME, t2.TYPENAME, t2.LENGTH 
from 
    syscat.columns t2 
where 
    TABNAME = '' 
    and TYPENAME in ('CHARACTER', 'VARCHAR')

如何落实这一点?

um6iljoc

um6iljoc1#

必须使用动态SQL来构造这样的查询。

--#SET TERMINATOR @
CREATE OR REPLACE PROCEDURE GET_UNUSED 
(
  P_TABSCHEMA VARCHAR (128)
, P_TABNAME   VARCHAR (128)
)
DYNAMIC RESULT SETS 1
BEGIN
  DECLARE V_STMT CLOB (2M);
  DECLARE C1 CURSOR WITH RETURN FOR S1;

SELECT 
'
SELECT *
FROM
(
SELECT 
  C.COLNAME     AS COLUMN_NAME  
, C.TYPENAME    AS COLUMN_TYPE  
, C.LENGTH      AS COLUMN_LENGTH
, C.LENGTH
- CASE C.COLNAME 
'
|| LISTAGG ('WHEN ''' || COLNAME || ''' THEN T."' || COLNAME || '"', x'0a')
|| '
END             AS UNUSED_LENGTH
FROM
(
  SELECT
'
|| LISTAGG ('MAX (COALESCE (LENGTH (RTRIM ("' || COLNAME || '")), 0)) AS "' || COLNAME || '"', x'0a' || ', ')
||
'
  FROM "' || P_TABSCHEMA || '"."' || P_TABNAME || '"'
||
'
) T
, SYSCAT.COLUMNS C
WHERE (C.TABSCHEMA, C.TABNAME) = (''' || P_TABSCHEMA || ''', ''' || P_TABNAME || ''')
AND C.TYPENAME IN (''CHARACTER'', ''VARCHAR'')
)
WHERE UNUSED_LENGTH <> 0
' 
INTO V_STMT
FROM SYSCAT.COLUMNS C
WHERE (C.TABSCHEMA, C.TABNAME) = (P_TABSCHEMA, P_TABNAME)
AND C.TYPENAME IN ('CHARACTER', 'VARCHAR')
;

  IF V_STMT IS NOT NULL THEN  
    PREPARE S1 FROM V_STMT;
    OPEN C1;
  ELSE 
    SIGNAL SQLSTATE '75000' 
      SET MESSAGE_TEXT = 'There is no such table or it doesn''t contain string columns';
  END IF;

END@
CALL GET_UNUSED ('SYSCAT', 'SCHEMATA')@

| 列名|类型名称|长度|未使用_长度|
| - ------|- ------|- ------|- ------|
| 审计政策名称|瓦尔查尔|一百二十八|一百二十八|
| 定义者|瓦尔查尔|一百二十八|一百二十|
| 业主|瓦尔查尔|一百二十八|一百二十二|
| 备注|瓦尔查尔|二百五十四|二百五十四|
| 方案名称|瓦尔查尔|一百二十八|一百一十四|

CALL GET_UNUSED ('SYSCAT', 'COLUMNS')@

| 列名|类型名称|长度|未使用_长度|
| - ------|- ------|- ------|- ------|
| 塔布舍马|瓦尔查尔|一百二十八|一百一十八|
| 标签名称|瓦尔查尔|一百二十八|九十|
| 列名|瓦尔查尔|一百二十八|六十六|
| 类型方案|瓦尔查尔|一百二十八|一百二十一|
| 类型名称|瓦尔查尔|一百二十八|一百一十二|
| 排序规则方案|瓦尔查尔|一百二十八|一百二十二|
| 排序规则名称|瓦尔查尔|一百二十八|一百二十|
| 高2键|瓦尔查尔|二百五十四|二一七|
| 低调|瓦尔查尔|二百五十四|二一九|
| 目标_类型方案|瓦尔查尔|一百二十八|一百二十八|
| 目标_类型名称|瓦尔查尔|一百二十八|一百二十八|
| 范围_表格|瓦尔查尔|一百二十八|一百二十八|
| 范围_标签名|瓦尔查尔|一百二十八|一百二十八|
| 源_标签方案|瓦尔查尔|一百二十八|一百二十八|
| 源标签名|瓦尔查尔|一百二十八|一百二十八|
| DL_特征|角色|十个|十个|
| 特殊_ prop |角色|八个|八个|
| 隐藏|角色|1个|1个|
| 隐含值|瓦尔查尔|二百五十四|二百五十四|
| 机密标签名称|瓦尔查尔|一百二十八|一百二十八|
| 鉴定人|瓦尔查尔|一百二十八|一百二十八|
| 备注|瓦尔查尔|二百五十四|二百五十四|
你的教授可能是一个相当有创造力的人:)

相关问题