프로시져에서 varchar를 사용할때 ' 외따옴표 없이 사용하는법이 있나요? 0 5 1,144

by 몽키매직 [PL/SQL] [2020.03.06 14:32:27]


질문이 이상한것 같긴한데 여쭤봅니다

컬럼타입은 NUMBER인데 LISTAGG로  6,4,3,1 형식으로 가져왔습니다.  VARCHAR 변수에 담았구요

이후 처리방식은  UPDATE COL = 6 WHERE COL IN ( 4,3,1) 이렇게 해야합니다. 제일 높은 NUMBER 로 수정하는거지요. 

변수에 담은 문자열을 IN절에 쓰고싶지만 '6,4,3,1' 로 되겠죠? 혹시 ' 없이 사용하는법이 있나요? 예로 Mybais $$ 처럼? 

Loop를 돌고있는중인데 다시 커서에 담고 갯수만큼 다중으로 loop를 돌려야할까요?

by 마농 [2020.03.06 14:42:07]

동적 쿼리를 사용하면 되지만. (EXECUTE IMMEDIATE)
http://gurubee.net/lecture/1720
애초에 테이블에서 가져오는 값이라면? 쿼리에 직접 테이블을 사용하면 되지 않나요?


by 몽키매직 [2020.03.06 15:04:55]

답변감사합니다.

말씀하신거처럼 동적 쿼리를 사용하려고 합니다. 헌데 VARCHAR변수를 동적쿼리로 만들어서 하면 '가 붙는지 궁금해서요

SEQNO := '6,4,3,1';

EXECUTE IMMEDIATE 'UPDATE TAB COL = 6 WHERE COL IN ( ' || SEQNO || ')';

이렇게 만들경우 UPDATE TAB COL = 6 WHERE COL IN ('6,4,3,1') 이렇게 되지 않을까 하는 궁금증이 들어서요.

6, 4, 3, 1의 총 4건의 UPDATE가 실행되어야 하는데 전체를 한문자로 읽어들이지않을까 합니다.

직접 테이블 사용의 이해를 못했습니다.

TAB에서 NO를 가져와서 TAB2, TAB3 두개의 참조테이블에는 MAX값인 6으로 업데이트 TAB에는 6를 제외한 나머지삭제

중복제거로 하루나 일주일 간격으로 실행하려고 하거든요

안될것같아서 LOOP를 선택했는데 궁금증 해소를 위해 로그라도 찍어보게 동적으로 해보긴 해야겠네요 ㅎㅎ


by 마농 [2020.03.06 15:10:40]

SQL은 집합적인고 구조적인 언어입니다.
지금은 너무 절차적으로 접근하고 계시네요.
여러 테이블을 조인하여 원하는 결과를 얻을 수 있습니다.


by 몽키매직 [2020.03.06 15:17:15]

앗 그런가요. ㅎㅎ

원래는 수동으로 하던 작업인데 자동으로 바꿔보려고 합니다 ㅎㅎ 

조언 감사합니다. 좀더 생각을 해봐야겠네요


by 마농 [2020.03.06 16:25:36]
DECLARE
    v_col1 tab1.col1%TYPE;
BEGIN
    SELECT MAX(col1)
      INTO v_col1
      FROM tab1
     WHERE /* 조건 */
    ;
    UPDATE tba2
       SET col1  = v_col1
     WHERE col1 != v_col1
       AND col1 IN (SELECT col1 FROM tab1 WHERE /* 조건 */)
    ;
    UPDATE tba3
       SET col1  = v_col1
     WHERE col1 != v_col1
       AND col1 IN (SELECT col1 FROM tab1 WHERE /* 조건 */)
    ;
    DELETE 
      FROM tab1
     WHERE /* 조건 */
       AND col1 != v_col1
    ;
END;
/

 

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