oracle 질문.(테이블을 랜덤으로 생성한다음 변수로 받고 이변수(테이블명)을 정적쿼리에서 사용할수 있는지) 0 4 6,455

by McKee [SQL Query] [2024.08.14 08:25:33]


안녕하세요. 오랜만에 질문드립니다.

아래와 같이 테이블을 랜덤으로 생성한다음에

tempTableName 에 변수로 담은 다음 이것을 정적 쿼리에서 사용할 수 있을까요?

요지는 이테이블에 데이터를 담은 다음에 정적쿼리에서 사용하려고 합니다.

 select 'TEMP_' || dbms_random.string('X', 10) into tempTableName from dual;   

   --DELETE TMP_SUMASSYLIST;
   l_companyid := p_companyid;
   
   open tempCur;
   fetch tempCur into v_temp;
   if tempCur%notfound then

       v_sql := 'create table ' || tempTableName
        ||'(    '
        ||'    AAA varchar2(10) not null,'
        ||'    BBB varchar2(8) not null,'
        ||'    CCC varchar2(3) not null,'
        ||'    DDD varchar2(3) null,'
        ||'    EEE varchar2(3) null,'
        ||'    FFF varchar2(3) null,'
        ||'    GGG varchar2(3) not null,'
        ||'    HHH date null,'
        ||'    III date null,'
        ||'    KJJ date null,'
        ||'    ZZZ date null,'
        ||'    ZZZZ number null,'
        ||'    ZZZZ VARCHAR2(1)'
        ||')    ';
        execute immediate v_sql;
   end if;

 

최종적으로 아래 sql 을 돌리려고 할때 저 TMP_ASSY 대신 위에서 생성한 tempTableName 을 사용하고 싶은데 방법이 없을까요?

아래는 간단하게 적었지만 쿼리길이가 제법되서 이정도로만 올림니다.

 SELECT * FROM MA_DDD WHERE (CCC, DDD, EEE) IN (SELECT DISTINCT CCC, DDD, EEE FROM TMP_ASSY   <-- 요 TMP_ASSY 대신 위에서 생성한 테이블을 사용하고 싶습니다.

 

 

 

by 마농 [2024.08.14 08:42:36]
-- 뷰를 만드세요.
v_sql := 'CREATE OR REPLACE VIEW view_tmp_assy AS SELECT * FROM ' || tempTableName;
EXECUTE IMMEDIATE v_sql;
SELECT * FROM view_tmp_assy;

 


by McKee [2024.08.14 08:50:18]

마농님 답변 감사합니다.

혹시 이프로세스가 여러사람이 동시 진행한다고 하면 말씀하셨던것처럼 뷰테이블을 만들었을때 문제가 되지 않을까요? 

처음 랜덤으로 테이블을 만드는이유가 여러사람이 동시에 진행했을 때 TABLE LOCK 을 피하기 위한거거든요.

저도 이프로세스가 마음에 들지 않는데 처음부터 다 다시 만들수도 없고 있는 상황에서 개선을 하려고 합니다.


by 마농 [2024.08.14 09:05:37]

고정 이름으로 임시테이블을 만드세요.
임시테이블은 본인 세션에서 입력한 자료만 보이고 사용이 끝나면 자료는 사라집니다.
gurubee.net/lecture/4039


by McKee [2024.08.14 09:34:16]

오 이런개념이 있었네요 이방법으로 한번 해보겠습니다.

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