使用VARRAY和FOR-LOOP正确构建动态SQL

使用VARRAY和FOR-LOOP正确构建动态SQL,for-loop,variables,dynamic-sql,execute-immediate,varray,For Loop,Variables,Dynamic Sql,Execute Immediate,Varray,我开始编写一个脚本,编写多行INSERT语句,然后将其升级为使用数组为每个唯一的WHERE子句构建动态SQL。 示例如下: DECLARE type tablearray1 IS VARRAY(3) OF VARCHAR2(100); type tablearray2 IS VARRAY(3) OF VARCHAR2(100); emp_tab tablearray1; dept_tab tablearray2; total integer; BEGIN

我开始编写一个脚本,编写多行INSERT语句,然后将其升级为使用数组为每个唯一的WHERE子句构建动态SQL。 示例如下:

DECLARE
    type tablearray1 IS VARRAY(3) OF VARCHAR2(100);
    type tablearray2 IS VARRAY(3) OF VARCHAR2(100);
    emp_tab tablearray1;
    dept_tab tablearray2;
    total integer;
BEGIN
    emp_tab := tablearray1('employees','managers','visitors');
    total := emp_tab.count();
    FOR i in 1 .. total LOOP
        STMT:= 'insert into '||emp_tab(i)||' where pers_id in ...blah...';
        EXECUTE IMMEDIATE stmt;
    END LOOP;

    dept_tab := tablearray1('departments','sales','factory');
    total := dept_tab .count();
    FOR i in 1 .. total LOOP
        STMT:= 'insert into '||dept_tab (i)||' where dept_id in ...blah...';
        EXECUTE IMMEDIATE stmt;
    END LOOP;
    COMMIT;
END;
/

Q1这种方法可以接受吗?我不确定这是一个好的精益方法,还是我可以更好地利用数组和循环。我的脚本current对于每个INSERT语句都有一个VARRAY和FOR循环,所以这个列表越来越大

Q2重用SQL字符串占位符变量(STMT)也是一种不好的做法,还是应该为每个SQL语句分配一个唯一的变量

非常感谢 戴尔