database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39444 게시물 읽기
No. 39444
고수님들께..오라클 function 관련 질문드립니다.
작성자
박정우(ppi1234)
작성일
2012-05-09 14:42
조회수
4,395

create or replace function FN_IN_BRAND_RANK(yearmonF TB_IN_POP_PROMO_M.YEAR_MON%TYPE, yearmonT TB_IN_POP_PROMO_M.YEAR_MON%TYPE, region TB_IN_POP_PROMO_M.REGION%TYPE, country TB_IN_POP_PROMO_M.COUNTRY%TYPE, product TB_IN_POP_PROMO_M.PRODUCT%TYPE, brand TB_IN_POP_PROMO_M.BRAND%TYPE) return number is
  v_rank number;
begin
  FOR RANKVALUES IN (
               SELECT GOLD_RANK, BRAND_NAME                                                                                                                                                         
               FROM (                                                                                                                                                 
                        SELECT                                                                                                           
                         BRAND_NAME                                                                                                                     
                         ,RANK() OVER (ORDER BY DECODE(BRAND_NAME,'LG',999999999,                              
                                 GOLDEN_Y_UNCONV + GOLDEN_Y_BRAND + GOLDEN_Y_ON + GOLDEN_Y_OFF) DESC) GOLD_RANK                                                                                                                                   
                        FROM (                                                                                                                                                
                            SELECT 1                                                                                                                                      
                                ,PD.COUNTRY   COUNTRY_NAME                                                                                                         
                                ,PD.BRAND   BRAND_NAME                                                                                                               
                                ,SUM(DECODE(PD.GOLDEN_ZONE_YN,'Y',PD.UNCONVENTIONAL,0)) GOLDEN_Y_UNCONV                                  
                                ,SUM(DECODE(PD.GOLDEN_ZONE_YN,'Y',PD.BRAND_ONLY,0)) GOLDEN_Y_BRAND                                           
                                ,SUM(DECODE(PD.GOLDEN_ZONE_YN,'Y',PD.ON_PRODUCT,0)) GOLDEN_Y_ON                                                
                                ,SUM(DECODE(PD.GOLDEN_ZONE_YN,'Y',PD.OFF_PRODUCT,0)) GOLDEN_Y_OFF                                              
                             FROM TB_IN_POP_PROMO_M  PD                                                                                                            
                             WHERE PD.YEAR_MON BETWEEN  yearmonF   AND  yearmonT  
                             AND PD.REGION =   region
                             AND PD.COUNTRY =  country
                             AND PD.PRODUCT = product
                             AND PD.BRAND <> 'RETAILER'          
                             GROUP BY 1,PD.COUNTRY,PD.BRAND                                                    
                          )
               )                                                    
              WHERE GOLD_RANK < 5             
       ) LOOP   
    IF (RANKVALUES.BRAND_NAME = brand) THEN
       --DBMS_OUTPUT.put_line(brand || ' - ' || RANKVALUE.BRAND_NAME);
      v_rank := RANKVALUES.GOLD_RANK;
       EXIT;
    END IF;
   END LOOP;
  return(v_rank);
end FN_IN_BRAND_RANK;

 

다음과 같이 function 하나를 만들었는데요, 또 항상 저런 방식으로 만들어서 사용해왔는데,  이건 도통 무슨 문제인지.. 몰라서 고수님들께 여쭤보고자 합니다.

COUNTRY  BRAND     GOLD_RANK    FUN_RANK

Indonesia   LG               1                        1
Indonesia   Sharp          2 
Indonesia   SS                3 
Indonesia   Toshiba      4 
 

저 loop 안에 쿼리를 실행하면 다음과 같이 LG, SHARP, SS, Toshiba 이렇게 4건의 데이타가 나오는데요,

실제 function안에서 돌려보면 LG 만 6번 loop가 돌더라구요.. 어디가 잘 못된건지.. 봐도 잘 모르겠습니다.

고수님들의 답변 부탁드리겠습니다.

 

이 글에 대한 댓글이 총 2건 있습니다.

변수명을 컬럼명과 동일하게 사용하셨네요.
PL/SQL 코딩에서 사용하실 때는 문제 없겠지만
SQL 내에서 사용하신다면
이를 변수로 인식할까요? 컬럼으로 인식할까요?
===> 컬럼으로 인식합니다.
변수명을 컬럼명과 차별화 하세요.
region ===> v_region

마농(manon94)님이 2012-05-09 16:41에 작성한 댓글입니다.

ㅠㅠ 마농님.. 진심으로 감사드립니다.

지금껏 변수는 그렇게 네이밍을 처리해서 사용해왔는데..ㅠㅠ

에궁..잠시 잊고 있던 부분을 다시 깨우쳐 주셔서 감사드립니다.ㅠㅠ

 

박정우(ppi1234)님이 2012-05-09 20:14에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39447오라클 trc 질문드립니다.
윤명철
2012-05-11
3865
39446조인하는 테이블의 구동순서 [1]
박재현
2012-05-11
3446
39445한 row의 데이터로 행,열 나눠서 조회하기 [3]
질문자
2012-05-09
3606
39444고수님들께..오라클 function 관련 질문드립니다. [2]
박정우
2012-05-09
4395
39443정렬을 하고 싶은데요 [1]
어떻게하지
2012-05-09
3547
39442특정시점부터 변경된 테이블들의 리스트를 알수 있을까요?
하이요
2012-05-09
3344
39441데이터 매칭 시키는 방법좀....알려주세요 [2]
김만석
2012-05-08
3807
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다