2014-04-01 24 views
0

我是DB2 PL/SQL的新手,遇到了一些麻烦,因为没有太多的社区资源,除了没有回答我所有问题的官方文档。DB2 - 函数返回指定列的最大值

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

第一个准备查询并执行它,但我不能执行选择查询到一个变量。下面是不执行的代码:

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作为变量。我会为你提供帮助。 Window函数并不是一个很好的选择,因为我需要在迁移过程中使用这个函数,而不是简单的select语句。

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

干杯, 强尼

+1

请你的错误编辑你的问题。例如,它可能只是一个权限错误。 –

+0

完成,但我猜想之后会出现一些更多的错误,因为我还没有完全掌握函数类型和逻辑。 – fetta

+0

@Gordon_Linoff用'BEGIN'替换'BEGIN ATOMIC'函数执行,但是当我尝试运行时:'从sysibm.sysdummy1'选择ub.getMaxColValue('pk','pk_reguly','reg_id')我得到: 查找错误 - DB2数据库错误:错误[07003] [IBM] [DB2/AIX64] SQL0518N在EXECUTE语句中命名的语句不处于预备状态,或者是SELECT或VALUES语句。 我编辑了原始帖子,所以现在第一个函数能够执行。 – fetta

回答

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 
+0

非常感谢,这正是我需要的。我已经尝试了一些与光标shananigans之前,但没有做到这一点:) – fetta