PLSQL LOOP질문 1

by 김민수 [PL/SQL] [2023.04.26 20:38:02]


아래의 STEP3 과정이 PLSQL 이중 LOOP 만으로가능할까요?


step 1)  v_table_name1 변수를 받는다.

select table_name 
into v_table_name1
from  user_tab_partitions a
        delete_tb_info b 
where  a.table_name = b.table_name 

step 2) v_partition_name, v_table_name2 변수를 받는다.

select a.partition_name as YYMM ,a.table_name
into :v_partition_name , v_table_name2
from  user_tab_partitions a
where a.partition_name = : v_table_name1

step 3) 해당 변수 파티션 테이블 truncate 
ALTER TABLE v_table_name2  TRUNCATE PARTITION v_partition_name;

커서로 변수를 받아 다이나믹쿼리에 변수를 넣는다 라는 개념만 박혀있는데

변수를 받아 또 그변수로 받아 처리하려니 쉽게 안떠오르네요...

 

by 마농 [2023.04.27 01:44:27]
-- 1. 2중 LOOP 를 이용할 수도 있지만.(절차적 사고)
DECLARE
    CURSOR cur1 IS
    SELECT table_name
      FROM delete_tb_info
    ;
    CURSOR cur2(v_table_name VARCHAR2) IS
    SELECT partition_name
      FROM user_tab_partitions
     WHERE table_name = v_table_name
    ;
    v_sql VARCHAR2(200);
BEGIN
    FOR c1 IN cur1 LOOP
        FOR c2 IN cur2(c1.table_name) LOOP
            v_sql := 'ALTER TABLE ' || c1.table_name
                  || ' TRUNCATE PARTITION ' || c2.partition_name;
--            dbms_output.put_line(v_sql);
            EXECUTE IMMEDIATE v_sql;
        END LOOP;
    END LOOP;
END;
/

-- 2. 조인으로 풀 수 도 있습니다.(집합적 사고)
DECLARE
    CURSOR cur1 IS
    SELECT 'ALTER TABLE ' || a.table_name
        || ' TRUNCATE PARTITION ' || b.partition_name AS v_sql
      FROM delete_tb_info a
         , user_tab_partitions b
     WHERE a.table_name = b.table_name
    ;
BEGIN
    FOR c1 IN cur1 LOOP
--        dbms_output.put_line(c1.v_sql); 
        EXECUTE IMMEDIATE c1.v_sql;
    END LOOP;
END;
/

 

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