2013-02-14 2 views
1

SQL UDF를 사용하여 일부 행을 집계하려고합니다. 먼저 자신의 ID가 & 인 행을 선택하고 쉼표로 구분 된 열로 연결합니다. 내 함수에서 for 루프 내부에있는 order by 절에서 오류가 발생했습니다. order by 절을 제거하지 않고이 방법을 사용할 수 있습니까?for 루프 (SQL UDF)

where recId=recId 

DB2는 함수 매개 변수와 다른 것으로 이들 중 하나를 원하는 실현되지 않습니다 내 데이터베이스는 DB2

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은 일반적으로 루프와 함께 사용하지 않아야합니다. 왜냐하면 대부분의 엔진이 이러한 용어로 '생각'하도록 작성되지 않았기 때문입니다. 그리고 'EUR'는 '모호한'형식으로, 월/일이 반전되어 나타날 수 있습니다 (특히 '표준'분리자를 사용할 때). 이 결과가 나왔다면 아마 미국의 날짜가 정해 졌을 것입니다! 이것은 재귀 적 CTE의 사용을 통해 이루어질 수 있지만, 반드시 해야할지는 모르지만 ... –

+0

@ Clockwork-Muse 자세한 응답을 주셔서 감사합니다.하지만 루프를 사용하지 않는 것에 동의하지만 바보입니다. 요구 사항. 요구 사항은 쿼리에서 이미 반환 된 각 데이터 행의 날짜를 표시해야하는 보고서에 대한 것입니다. 나는 dd/MM/yyyy 형식으로 날짜 형식을 지정하기 위해 EUR를 사용했습니다 (기본값은 yyyy/dd/MM으로 데이터베이스에 저장됩니다). –

+0

@ Clockwork-Muse 재귀에 대해서는 오류가 발생하기 쉽기 때문에 재귀를 사용하고 싶지 않습니다. 재귀 SQL 문에 대한 최대 레벨도 알지 못합니다. –

답변

1

이 작동하지 않을 것입니다 열 이름 두 행 모두에 동일한 행을 사용하여 모든 행을 반환하는 효과가 있습니다. 함수 매개 변수의 이름을 열 이름과 다른 이름으로 지정해야합니다.

위와 다른 코드는 위와 비슷합니다.

새로운 기능을 작성 하시겠습니까? 한 가지 흔한 실수는 SQL 편집기의 문장 구분 기호를 ;으로 설정하는 것입니다. 이렇게하면 모든 것을 하나의 명령으로 보내지 않고 함수를 명령문으로 분해 할 수 있습니다. 위와 같은 구문 오류가 많이 발생합니다 (이미 알고있는 경우 미안하지만 그 사실을 파악하는 데 다소 시간이 걸립니다!).

+0

지적 해 주셔서 고맙습니다. 내가 말한대로 매개 변수의 이름을 변경했습니다. 나는 SQL UDF를 처음 접했을 뿐이다. 위의 코드에서 '선택'satatement에 대한 구분 기호를 사용하지 않았다. 각 문장의 구분 기호를 참조하고 있습니까? 나는 그들을 모두 제거해야합니까? 이해해 주셔서 감사합니다 ... –

+0

@DamienJoe,이 SQL 코드를 실행하기 위해 어떤 프로그램을 사용하고 있습니까? 설정의 어딘가에서 프로그램은 명령문 구분자를 지정하여 명령문을 구분할 수있게합니다. 보통 이것은';'로 설정됩니다. 해당 설정을 다른 것으로 변경하려고합니다. 함수 자체에서 세미콜론을 제거하지 마십시오. 데이터베이스에 전송해야합니다. –