2014-04-01 39 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