DB2 - 从指定列返回最大值的函数

时间:2014-04-01 10:35:44

标签: sql db2

我是DB2 PL / SQL的新手并遇到了一些麻烦,因为除了官方文档之外没有太多的社区资源,但我的所有问题都没有回答。

我正在进行一些数据迁移,并且需要一个从指定表返回指定列的最大值的函数。在过去的两个小时里,我提出了两种方法,但由于缺乏对DB2 PL / SQL的了解,所以这些方法都不起作用。

第一个是准备查询并执行它,但我无法对变量执行select查询。这是不执行的代码:

CREATE OR REPLACE FUNCTION getMaxColValue (schemaName VARCHAR(30), 
    tableName VARCHAR(30), columnName VARCHAR(30))
-- function used to get max ID of a column during data migration
RETURNS INTEGER
LANGUAGE SQL
BEGIN
    DECLARE query VARCHAR(1000);
    DECLARE maxColValue INT;
    DECLARE stmt STATEMENT;

  SET query = 'select max(' || columnName || ') from ' || schemaName || '.' || tableName || '';
    PREPARE stmt FROM query;
    EXECUTE query INTO maxColValue;
    RETURN maxColValue;

END

错误返回:

Lookup Error - DB2 Database Error: ERROR [07003] [IBM][DB2/AIX64] SQL0518N  The statement named in the EXECUTE statement is not in a prepared state or is a SELECT or VALUES statement.

我也尝试过类似的东西,返回标量SQL值:

CREATE FUNCTION getMaxColValue_2 (schemaName VARCHAR(30), tableName VARCHAR(30), columnName VARCHAR(30))
     RETURNS INT 
     LANGUAGE SQL
     READS SQL DATA
     NO EXTERNAL ACTION
     DETERMINISTIC
     RETURN
       SELECT max(columnName)
         FROM schemaName.tableName;

错误返回:

Lookup Error - DB2 Database Error: ERROR [42704] [IBM][DB2/AIX64] SQL0204N  "SCHEMANAME.TABLENAME" is an undefined name.

但我想在这里将schemaname和tablename作为变量传递起来比较困难。我会很乐意接受任何帮助。窗口函数不是一个选项,因为我需要在迁移过程中使用此函数而不是简单的select语句。

有一些语法错误,但由于我缺乏PL / SQL知识,可能会出现一些逻辑错误。

干杯, 尊利

1 个答案:

答案 0 :(得分:2)

您无法EXECUTE SELECT语句,这正是错误消息告诉您的内容。

相反,您应该声明一个游标,打开它,然后将结果提取到您的变量中:

CREATE OR REPLACE FUNCTION getMaxColValue (schemaName VARCHAR(30), 
tableName VARCHAR(30), columnName VARCHAR(30))
RETURNS INTEGER
LANGUAGE SQL
not deterministic
reads sql data
begin
 declare l_max int;
 declare c_cur cursor for l_stmt;

 prepare l_stmt from 'select max(' || columnName || ') from ' || rtrim(schemaName) ||
 '.' || tableName;
 open c_cur;
 fetch c_cur into l_max;
 close c_cur;
 return l_max;
end