2017-11-07 21 views
2

私は 'dcbhmoh1'の代わりに 'schemasname'という変数を使用したいので、forall構文に対してexecute immediateを使用します。 おかげPLSQL - 即時実行でFORALL

DECLARE 
    schemasname varchar2(25) := 'dcbhmoh1'; 
    datet char(6) := '102024'; 

    TYPE anames IS table of dcbhmoh1.F01131M%ROWTYPE; 
ar anames; 

BEGIN 

     EXECUTE IMMEDIATE 'SELECT * FROM ' || schemasname || '.F01131M WHERE ZMDTI >= ' || datet BULK COLLECT INTO ar; 
dbms_output.put_line(ar.count); 
    IF ar.Count > 0 THEN 
     EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || schemasname || '.F01131M'; 

     FORALL i in ar.first .. ar.last INSERT INTO dcbhmoh1.F01131M VALUES ar(i); 

    END IF; 
END; 
+0

テーブルを分割し、古いパーティションを切り捨てることを検討してください。 –

答えて

1

あなたはこのような

EXECUTE IMMEDIATE 'Alter session set current_schema='|| schemasname ; 

であなたの作業セッションのためのスキーマを定義しようとすることができます:

DECLARE 
    schemasname varchar2(25) := 'dcbhmoh1'; 
    datet char(6) := '102024'; 

    TYPE anames IS table of dcbhmoh1.F01131M%ROWTYPE; 
ar anames; 

BEGIN 
    -- set schema 
    EXECUTE IMMEDIATE 'Alter session set current_schema='|| schemasname ; 
    -- do your work 
    EXECUTE IMMEDIATE 'SELECT * FROM F01131M WHERE ZMDTI >= ' || datet BULK COLLECT INTO ar; 
    dbms_output.put_line(ar.count); 
    IF ar.Count > 0 THEN 
    EXECUTE IMMEDIATE 'TRUNCATE TABLE F01131M';  
    FORALL i in ar.first .. ar.last INSERT INTO F01131M VALUES ar(i);  
    END IF; 
END; 

(ただしFORALLの完全な構文についてはよく分かりません)。

+0

ありがとう、この作品は魅力のようです –

関連する問題