我是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知识,可能会出现一些逻辑错误。
干杯, 尊利
答案 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