【发布时间】:2015-07-09 19:20:20
【问题描述】:
我有一个非常简单的存储过程,可以根据我的模式和表参数在特定模式中查找表。
问题是存储过程返回表的所有行。
- 它忽略了我的第二个参数(table_name)
- 我可能拼错了 table_name 参数并且过程返回了所有行。
- 如果我拼错架构参数,它将不会返回任何行。
有什么想法吗?提前致谢。存储过程如下。
CREATE OR REPLACE PROCEDURE FINDTABLECOLUMNS
(IN SCHEMA VARCHAR(25), IN TABLE_NAME VARCHAR(25))
LANGUAGE SQL
READS SQL DATA
RESULT SETS 1
BEGIN
DECLARE COLUMN_TABLE_LIST CURSOR WITH RETURN TO CALLER FOR
SELECT
ROW_NUMBER ( ) OVER ( ORDER BY TABLE_NAME , ORDINAL_POSITION ) AS #
,TABLE_NAME
,COLUMN_NAME
,SYSTEM_COLUMN_NAME
,DATA_TYPE
,LENGTH
,COLUMN_TEXT
FROM QSYS2 . SYSCOLUMNS
WHERE TABLE_SCHEMA = UPPER ( SCHEMA ) AND TABLE_NAME = UPPER ( TABLE_NAME )
FOR READ ONLY ;
OPEN COLUMN_TABLE_LIST ;
END
【问题讨论】:
-
如果您已经拥有 ORDINAL_POSITION,是否还需要 ROW_NUMBER()? SCALE 在此类查询中通常很方便,用于(压缩)小数或(分区)数字列上的小数位数。
-
你需要考虑到对象的限制:schema是一个varchar(128),和tablename一样。此外,如果架构少于 8 个字符,它将添加额外的空格以适应。这是在LUW,其他平台我不知道
-
使用 ROW_NUMBER() 是我获得列数的俗气,因为我还不知道如何使用 DB2 来做这件事。我是在 MSSQL 上长大的,所以我身处一个全新的世界。 :-)
标签: stored-procedures db2