DB2动态SQL无法赋值v_columns,变量始终为NULL问题求助
DB2动态SQL获取列名失败问题解决
导致v_columns始终为NULL的常见原因及修复方案:
表名大小写不匹配
SYSCAT.COLUMNS里的TABNAME默认存储为大写,要是v_tableName是小写或混合大小写,WHERE条件会匹配不到任何行,LISTAGG没有输入自然返回NULL。
修复:统一转大写,修改WHERE子句:WHERE UPPER(TABNAME) = UPPER(''' || v_tableName || ''') AND COLNAME <> ''TOWID''或者直接确保
v_tableName传入的是大写值。未执行动态SQL
你只拼接了SQL字符串v_sql,但DB2需要用EXECUTE IMMEDIATE来执行动态SQL,否则变量根本不会被赋值。
完整示例代码:DECLARE v_sql VARCHAR(1000); DECLARE v_columns VARCHAR(1000); DECLARE v_tableName VARCHAR(100) = '你的表名'; SET v_sql = 'SELECT LISTAGG(COLNAME , '','') WITHIN GROUP (ORDER BY COLNO) INTO :v_columns ' || 'FROM SYSCAT.COLUMNS ' || 'WHERE UPPER(TABNAME) = UPPER(''' || v_tableName || ''') AND COLNAME <> ''TOWID'''; EXECUTE IMMEDIATE v_sql USING OUT v_columns; -- 必须添加此句执行SQL并赋值无匹配列时返回NULL
如果目标表只有TOWID这一列,LISTAGG会返回NULL。可以用COALESCE兜底返回空字符串:SELECT COALESCE(LISTAGG(COLNAME , ','), '') WITHIN GROUP (ORDER BY COLNO) INTO :v_columns缺失模式过滤
要是表不在默认模式下,SYSCAT.COLUMNS可能找不到目标表,建议加上模式过滤:WHERE UPPER(TABNAME) = UPPER(''' || v_tableName || ''') AND UPPER(TABSCHEMA) = UPPER(''' || v_schemaName || ''') -- 添加上表所在模式 AND COLNAME <> ''TOWID''
内容的提问来源于stack exchange,提问作者Ganesh Manneedi
相关产品推荐
相关产品推荐

