아래의 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;
커서로 변수를 받아 다이나믹쿼리에 변수를 넣는다 라는 개념만 박혀있는데
변수를 받아 또 그변수로 받아 처리하려니 쉽게 안떠오르네요...
-- 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;
/