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 에서 뭘 써도 오류가 나서 이런 상태입니다...
마이그레이션을 잘 못하는 신입에게 도움 부탁드립니다 ㅠㅠ...
오라클 구문도 불필요한 구문이 많네요.
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')
감사합니다.
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만 두번 하면 됨
으로 결과값이 나와서 저렇게 수정했습니다.
감사합닌다!!
앗 그렇습니다!
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 를 신경쓰지 않았는데 제가 누락시켰던 점을 가르쳐 주셔서 감사합니다 ㅎ...