我是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