Stored procedures 返回太多行的DB2存储过程

Stored procedures 返回太多行的DB2存储过程,stored-procedures,db2,Stored Procedures,Db2,我有一个非常简单的存储过程,可以根据模式和表参数在特定模式中查找表 问题是存储过程返回表的所有行 它忽略我的第二个参数(表名称) 我可能拼错table_name参数,该过程将返回所有行 如果我拼错了schema参数,它将不会返回任何行 有什么想法吗?提前谢谢。存储过程如下所示 CREATE OR REPLACE PROCEDURE FINDTABLECOLUMNS (IN SCHEMA VARCHAR(25), IN TABLE_NAME VARCHAR(25)) LANGUAGE SQL

我有一个非常简单的存储过程,可以根据模式和表参数在特定模式中查找表

问题是存储过程返回表的所有行

  • 它忽略我的第二个参数(表名称)
  • 我可能拼错table_name参数,该过程将返回所有行
  • 如果我拼错了schema参数,它将不会返回任何行
有什么想法吗?提前谢谢。存储过程如下所示

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 

我认为这是因为columnname和parametername是相等的。你可以解决它:

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
是一个保留字,不应用于参数或变量名。此外,考虑目录中的表和模式名称可能是小写的。@避免保留名称的MUSTASCIO是我的“@”前缀注释背后的原因之一,但我应该解释,EH?吕克……非常感谢!正如穆斯塔西奥和沃伦指出的那样,我有一种感觉,那将是一次额头抽打。Idk我怎么错过了这么明显的事情。我喜欢Warren在变量名前面加上“@”的想法。它使识别变量变得更容易。我注意到的另一件事是System I Navigator(我正在使用的)不显示颜色编码,所以我不知道何时使用保留字,何时不使用。我得小心点。再次感谢大家!如果已经有序号位置,是否需要行号()?SCALE在此类查询中通常很方便,例如(压缩的)十进制或(分区的)数字列的小数位数。您需要考虑对象的限制:schema是与tablename相同的varchar(128)。此外,如果模式少于8个字符,它将添加额外的空格以适应。这是在LUW中,我不知道对于其他平台,使用ROW_NUMBER()是我获取列计数的最拿手的方法,因为我还不知道如何使用DB2来实现这一点。我是在MSSQL上长大的,所以我身处一个全新的世界。:-)