2013-02-14 72 views
1

我想使用SQL UDF來聚合一些行。我想先選擇按其編號&排序的行,然後將它們連接在逗號分隔的列中。我的函數中的order by子句出現錯誤,因爲它在for循環中。有沒有辦法在不刪除order by子句的情況下運行此操作?我的數據庫是DB2in for循環排序(SQL UDF)

CREATE FUNCTION mySchema.getDates(recId INTEGER) 
RETURNS VARCHAR(1024) 
LANGUAGE SQL 
    BEGIN ATOMIC 
     DECLARE STR VARCHAR(1024); 
     SET STR = '' ; 
     LOOP1 : FOR ROW AS (select replace(char(myDate,EUR),'.','/') as myDate from myTable.BookingDates where recId=recId order by rec_crt-id) 
     DO 
      IF ROW.myDate IS NOT NULL THEN 
       SET STR = STR || CAST (ROW.myDate AS VARCHAR (20)) || ', ' ; 
      END IF ; 
     END FOR; 
    RETURN STR ; 
END 
SQL State: 42601 
Vendor Code: -199 
Message: [SQL0199] Keyword ORDER not expected. Valid tokens:) UNION EXCEPT. Cause . . . . . : The keyword ORDER was not expected here. 
+0

...爲什麼你想要這個作爲分隔列?大多數類型的格式化應該在應用程序層完成。什麼版本的DB2?而且,一般來說SQL不應該與循環一起使用,因爲大多數引擎並沒有被寫成用這些術語來「思考」。而「歐元」是一個'模棱兩可'的格式,在那個月/日可能會出現逆轉(特別是使用'標準'分隔符時)。如果我看到這個輸出,我可能會假設USA格式的日期!請注意,這可以通過使用遞歸CTE,但我不知道它應該是... – 2013-02-14 18:54:24

+0

@ Clockwork-Muse感謝您的詳細回覆,我同意你不使用循環,但它是一個愚蠢的需求。這個要求是針對一個報告,我必須顯示查詢已經返回的每一行數據的日期。我已用歐元格式化日期,格式爲日/月/年(格式)(默認情況下,它們以yyyy/dd/MM存儲在數據庫中)。 – 2013-02-15 04:49:50

+0

@ Clockwork-Muse關於遞歸,我不想使用遞歸,因爲它很容易出錯。我也不知道遞歸sql語句的最大級別。 – 2013-02-15 04:51:57

回答

1

這是行不通的:

where recId=recId 

DB2將不知道你想要的其中之一是功能參數和其他列名稱。它將爲兩者使用相同的一個,從而具有返回所有行的效果。你需要命名你的函數參數與列名不同。

除此之外,與上述類似的代碼適合我。

你是否是新來編寫函數?一個常見的錯誤是將SQL編輯器的語句分隔符設置爲;。這將使它試圖將功能分解爲語句,而不是將整個事件作爲單個命令發送。它會導致很多類似上面的語法錯誤(對不起,如果你已經知道了,但是花了一段時間才弄清楚了!)。

+0

謝謝你指出。正如你所說,我已經重新命名了參數。我對SQL UDF相當陌生,在上面的代碼中我沒有使用分隔符來選擇'select'。你是否提到每個陳述的分隔符?我應該刪除它們嗎?感謝您的理解... – 2013-02-15 09:34:10

+0

@DamienJoe,您使用什麼程序來運行此SQL代碼?在設置的某個地方,程序將讓您指定語句分隔符來分隔語句。通常這被設置爲';'。您想要將該設置更改爲其他內容。不要從函數本身刪除分號;那些需要被髮送到數據庫。 – 2013-02-15 09:47:51