2016-07-31 5 views
0

DB2에서 재귀 테이블 함수를 작성하는 데 문제가 있습니다. I 값들의 표가DB2 재귀 UDF 표

는 ....

I는 UDF 테이블을 전달해야
With t (Adjustment) as (
VALUES (100) 
    , (200) 
    , (300) 
) select * from t; 

는 개구 값 함수 (5000 말)와 인자 (0.1 말) I 필요한

다음 ....

Opening Shift Adjustment Closing 
(3)  (1)  (2) 
================================================== 
5000 500  100  5600    
5600 560  200  6360 
6360 636  300  7296 
  1. 시프트를 한 결과를 보여 = 0.1 * 개관
  2. 폐회 = 열기 +
  3. 열기가 나는 앞으로 가져 가져하려고 할 때

내 재귀 함수가 걸리면 이전 행의 폐쇄 (SQL0345N 재귀 공통 테이블 표현식의 fullselect가있다 닫기 + Shift)

어떻게하는지 잘 알고 있습니다. 저장 프로 시저가이 작업을 수행 할 수 있다는 것을 알고 있지만 다른 UDF에서 확장 될 수 있도록 UDF를 사용해야합니다.

+0

_ 이전 행 _을 판별 할 수 있도록 테이블 T의 데이터 정렬을 정의합니다. 아마 특별한 순서없이 row_number() over()? 또한 OP에서 2)는 Opening + Shift + Closing으로 정의되지만, 결과에 따라 표현식은 Opening + Shift + Adjustment 여야합니다. – CRPence

답변

1

내가 여기에 내가 제대로 시나리오를 해석하는 경우 확실하지 오전하지만, 내가 무슨 짓을 :

(나는 함수에 입력을 모방하기 위해 몇 가지 변수를 만든 다음 재귀 공통 테이블 표현식을 구성하는 것, 시작하려면

create variable OpenedWith decimal  default 5000  
; 
create variable Factor  decimal(2, 1) default 0.1 
; 


with               
    t (adjustment) as (values(100), (200), (300))    
, ordRows (rn, Adjustment) as         
    (select row_number() over(), Adjustment from t)   
, addRows (rn, Opening, Shift, Adjustment, closing) as   
    (select rn, OpenedWith, OpenedWith*Factor , Adjustment  
      , (OpenedWith + (OpenedWith*Factor) + Adjustment) 
     from ordRows            
     where rn = 1            
    union all             
     select b.rn, a.Closing, a.Closing * Factor , b.Adjustment 
      , (a.Closing + (a.Closing * Factor) + b.Adjustment) 
     from addRows a            
     join ordRows b            
     on a.rn = (b.rn - 1)         
    )               
select int(rn) as rn, int(opening) as opening 
     , int(shift) as shift, adjustment  
     , int(closing) as closing    
from addRows         

,321 : RCTE)은이 변수로부터 얻어진 데이터를 사용하여 보고서를 생성 할

RN   OPENING   SHIFT  ADJUSTMENT   CLOSING 
    1   5,000    500    100   5,600 
    2   5,600    560    200   6,360 
    3   6,360    636    300   7,296 

이제 T라는 이름의 테이블에있는 데이터에 대해 작동하는 사용자 정의 테이블 함수 (UDTF)에 위의 스크립트 변수 작품 및 쿼리를 수정할 수 : 0 다음 위의 질의에서 보고서입니다

create function shifted_vals 
    (OpenedWith decimal(5)  
    , Factor  decimal(3, 2) 
)        
    returns table     
    (Opening  int   
    , Shift  int   
    , Adjustment int   
    , Closing  int   
)        
return       
with       
    ordRows (rn, Adjustment) as 
    (select row_number() over(), Adjustment from t)   
, addRows (rn, Opening, Shift, Adjustment, closing) as   
    (select rn, OpenedWith, OpenedWith*Factor , Adjustment  
      , (OpenedWith + (OpenedWith*Factor) + Adjustment) 
     from ordRows            
     where rn = 1            
    union all             
     select b.rn, a.Closing, a.Closing * Factor , b.Adjustment 
      , (a.Closing + (a.Closing * Factor) + b.Adjustment) 
     from addRows a            
     join ordRows b            
     on a.rn = (b.rn - 1)         
    )               
select opening, shift, adjustment, closing      
from addRows             
order by rn              


지금 인자로서 주목 개구 값 및 계수와 UDTF을 호출; 즉, 더 이상 생성 된 변수에 의존하지 않고 입력 매개 변수를 통해 얻은 값 대신 다음을 입력하십시오.

select t.*        
from table(shifted_vals(5000, 0.1)) as t 
; -- results as report, follows: 
    OPENING   SHIFT  ADJUSTMENT   CLOSING 
    5,000    500    100   5,600 
    5,600    560    200   6,360 
    6,360    636    300   7,296 
+0

감사 CRPence. 첫 번째 조회를 실행할 때 오류가 발생했습니다. SQL0345N 순환 공통 표 표현식 ".ADDROWS"의 fullselect는 둘 이상의 fullselect의 UNION이어야하며 열 함수, GROUP BY 절, HAVING 절, ​​ORDER BY 절 또는 ON 절을 포함하는 명시 적 조인. –

+0

그것은 작동합니다! CRPence ON 절을 제거해야합니다 ... 모든 조합 선택 b.rn, a.Closing, a.Closing * 0.1 b.Adjustment (a.Closing + (a.Closing * 0.1) + b.Adjustment) 여기서 B했던 addRows A, ordRows에서 a.rn = (b.rn - 1) –

+0

아! DB2 변형의 뉘앙스와 어떤 것이 사용되는지 명확히하는 태그가 없습니다. 나는 내가 사용하고있는 것을 지적해야했다. 표시된 JOIN 구문은 해당 조회가 실행 된 i SQL 용 DB2에서 허용 가능하며 IBM i 7.1에서 표시된 출력이 생성됩니다. 나는 대답을 편집한다], 나는이 주석이 오류가 발생한 사람을 돕는 역할을하도록 허용 할 것이다. – CRPence