【问题标题】:DB2 Stored Procedure Returning Too many rowsDB2 存储过程返回太多行
【发布时间】: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


【解决方案1】:

我认为这是因为列名和参数名是相等的。你可以解决它:

CREATE OR REPLACE PROCEDURE FINDTABLECOLUMNS 
(IN SCHEMA VARCHAR(25), IN TABLE_NAME_PAR 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_PAR )
FOR READ ONLY ;
OPEN COLUMN_TABLE_LIST ;
END 

【讨论】:

  • 就个人而言,我可能只是在参数名称的前面加上@
  • 另外,SCHEMA 是保留字,不应用于参数或变量名。另外,请考虑目录中的表和模式名称可能是小写的。
  • @mustaccio 避免保留名称是我的“@”前缀评论背后的原因之一,但我应该解释一下,嗯? ;-)
  • Luc...谢谢你!正如 mustaccio 和 Warren 指出的那样,我有一种感觉,这将是一个前额拍打器。 Idk 我怎么错过了这么明显的东西。我喜欢 Warren 在变量名前面添加“@”的想法。它可以更容易地识别变量。我注意到的另一件事是 System i Navigator(这是我正在使用的)不显示颜色编码,所以我不知道什么时候使用保留字,什么时候不使用。我只需要注意这一点。再次感谢大家!
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 2017-04-02
  • 2015-03-06
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多