Oracle 프로시저 Mssql로 변환 문의입니다. 0 5 2,018

by 시리 [PL/SQL] [2018.04.27 17:54:24]


TMP_OEP_CNT int;   


 select count(*) into TMP_OEP_CNT from cm_otp where USE_FL = 'Y';

  if TMP_OEP_CNT > 0 then
    FOR OEPList IN (
      SELECT OEP.OTP_PASSWORD, OEP.AUTH_PERIOD
      FROM (
        SELECT  OTP_PASSWORD, to_char(REG_DT,'YYYYMMDD')+7 as AUTH_PERIOD -- '+7'은 AGENT_OEP_OFF_AUTH_PERIOD 기간을 의미
        FROM CM_OTP
        WHERE USE_FL = 'Y'
        ORDER BY OTP_SQ DESC
      ) OEP
      WHERE ROWNUM=1
    ) LOOP
       TMP_QUERY := ' INSERT INTO TempVersion SELECT ''UserOEPPW'' AS CCF_FIELD, ''' || OEPList.OTP_PASSWORD || ''' AS CCF_VALUE FROM DUAL ';
       EXECUTE IMMEDIATE TMP_QUERY;
       TMP_QUERY :=  'INSERT INTO TempVersion SELECT ''AGENT_OEP_OFF_AUTH_PERIOD'' AS CCF_FIELD, ''' || OEPList.AUTH_PERIOD || ''' AS CCF_VALUE FROM DUAL ';
       EXECUTE IMMEDIATE TMP_QUERY;
    END LOOP;
  end if;

 

 

이런 프로시저를 변환하려 하는데

 


 DECLARE @TMP_OEP_CNT   INT
 
 SELECT @TMP_OEP_CNT = COUNT(*)
 FROM CM_OTP
 WHERE USE_FL = 'Y';
 
 IF @TMP_OEP_CNT > 0
  BEGIN
  
   EXEC();
  
  END

 

if문 사용하는 부분과 loop 에서 뭘 써도 오류가 나서 이런 상태입니다...

마이그레이션을 잘 못하는 신입에게 도움 부탁드립니다 ㅠㅠ...

by 마농 [2018.04.30 09:02:47]

오라클 구문도 불필요한 구문이 많네요.
FOR LOOP 를 사용했지만. ROWNUM = 1 조건을 사용햇으므로 1건만 가져오는 쿼리입니다.
LOOP 를 불필요하게 사용했구요.
for loop 가 아닌 Select Into 절을 사용하시면 됩니다.
MSSQL 의 경우 rownum=1 대신 TOP 1 을 사용해 변수에 대입하는 방식으로 하세요.
INSERT SELECT 구문을 사용했지만 FROM dual 을 사용했으므로 Select 구문이 무의미합니다.
그냥 INSERT VALUES 구문을 사용하시면 되구요.
EXECUTE IMMEDIATE 도 불필요합니다.
쿼리를 변수에 담아 다시 실행하지 마시고 바로 사용하면 됩니다.
이런 복잡한 구문들만 제거하고 기본 구문들로만 바꿔도 MSSQL로의 변환이 어렵지 않을 것입니다.

오류 구문도 보이네요.
TO_CHAR(reg_dt, 'yyyymmdd') + 7 은 잘못된 구문입니다.
문자에 7을 더하고 있네요.
날짜에 7을 더해야 합니다.
TO_CHAR(reg_dt + 7, 'yyyymmdd')


by 시리 [2018.04.30 16:06:40]

감사합니다.


 INSERT INTO @TempVersion (CCF_FIELD, CCF_VALUE) 
 SELECT TOP 1  'UserOEPPW', OTP_PASSWORD FROM CM_OTP WHERE USE_FL='Y'


 INSERT INTO @TempVersion (CCF_FIELD, CCF_VALUE) 
 SELECT TOP 1  'AGENT_OEP_OFF_AUTH_PERIOD',  CONVERT(VARCHAR(8),REG_DT,112)+7 AS AUTH_PERIOD FROM CM_OTP WHERE USE_FL='Y'

 

요렇게 만들었더니 잘 동작하네요!!

주신 분이 다른 프로시저를 보고 복붙 하여 만들어 주신 경우라 알려주신 것 토대로 분석을 해보니

1. 무조건 한 개만 출력함

2. 값을 넣을때 굳이 루프 돌릴 필요가 없음

3. insert만 두번 하면 됨

 

으로 결과값이 나와서 저렇게 수정했습니다.

감사합닌다!!


by 타락천사 [2018.04.30 09:19:59]

참고 하세요 

SSMA 툴을 설치 하시면, DB Object 에 대해서는 자동으로 Convert 됩니다. ( 안되는 부분도 있습니다. ^^;)

https://docs.microsoft.com/ko-kr/sql/ssma/oracle/getting-started-with-ssma-for-oracle-oracletosql?view=sql-server-2017


by 마농 [2018.04.30 16:12:40]

+ 7 의 위치를 다시 한번 더 확인하세요.
  - 현행 : 문자로 변환하여 7을 더하고 있는데? 잘못된 방식인 듯 보입니다.
  - 수정 : 날짜에 7을 더한 후에 문자로 변경하는게 맞을 듯 합니다.
적용 예
  - 예1) 2018.04.30 ==> '20180430' + 7 ==>  20180437  (X)
  - 예2) 2018.04.30 + 7 ==> 2018.05.07 ==> '20180507' (O)
그리고 TOP 1 사용에서
  - ORDER BY 절이 없네요?
  - ORDER BY 가 없으면 결과가 다른 쿼리가 됩니다.


by 시리 [2018.05.03 11:09:01]

앗 그렇습니다!

32일이 나왔습니다 ㅠㅠ...

 


 INSERT INTO @TempVersion (CCF_FIELD, CCF_VALUE)
 SELECT TOP 1  'UserOEPPW', OTP_PASSWORD FROM CM_OTP WHERE USE_FL='Y' ORDER BY OTP_SQ DESC


 INSERT INTO @TempVersion (CCF_FIELD, CCF_VALUE)
 SELECT TOP 1  'AGENT_OEP_OFF_AUTH_PERIOD',  CONVERT(VARCHAR(8),dateadd(dd, 7, REG_DT),112) AS AUTH_PERIOD FROM CM_OTP WHERE USE_FL='Y' ORDER BY OTP_SQ DESC

 

요런 식으로 수정했더니 잘 나오네요...

감사합니다 ㅠㅠㅠ....

최종적으로 조회되는 값이 1개라서 order by 를 신경쓰지 않았는데 제가 누락시켰던 점을 가르쳐 주셔서 감사합니다 ㅎ...

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입