Oracle PLSQL-FORALL立即执行

Oracle PLSQL-FORALL立即执行,oracle,plsql,oracle11g,dynamic-sql,Oracle,Plsql,Oracle11g,Dynamic Sql,我想对forall语法使用executeimmediate,因为我想使用变量“schemasname”而不是“dcbhmoh1”。 谢谢 您可以尝试使用定义工作会话的架构 EXECUTE IMMEDIATE 'Alter session set current_schema='|| schemasname ; 像这样: DECLARE schemasname varchar2(25) := 'dcbhmoh1'; datet char(6) := '102024';

我想对forall语法使用executeimmediate,因为我想使用变量“schemasname”而不是“dcbhmoh1”。 谢谢


您可以尝试使用定义工作会话的架构

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;

(不完全理解<代码> >所有< /COD> > .< /P>。您应该考虑分区表和截断/删除旧分区。

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;