我是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知识,可能会出现一些逻辑错误。
干杯, 强尼
请你的错误编辑你的问题。例如,它可能只是一个权限错误。 –
完成,但我猜想之后会出现一些更多的错误,因为我还没有完全掌握函数类型和逻辑。 – fetta
@Gordon_Linoff用'BEGIN'替换'BEGIN ATOMIC'函数执行,但是当我尝试运行时:'从sysibm.sysdummy1'选择ub.getMaxColValue('pk','pk_reguly','reg_id')我得到: 查找错误 - DB2数据库错误:错误[07003] [IBM] [DB2/AIX64] SQL0518N在EXECUTE语句中命名的语句不处于预备状态,或者是SELECT或VALUES语句。 我编辑了原始帖子,所以现在第一个函数能够执行。 – fetta