2013-02-14 73 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