表名,列名作为存储过程的参数

时间:2019-06-22 05:43:07

标签: oracle plsql sql-injection dynamic-sql

我是存储过程和PL / SQL的新手。现有一个将数据从一个表复制到另一个表的过程。我想重写存储过程以接受表名和列名作为参数。在解决方案上进行了谷歌搜索,但无法提出一个可靠的解决方案。

还计划添加列名作为参数,这样就不必在使用相同表和列的多个存储过程中重复添加列名,这有助于减少添加/删除列名时的维护。代码已添加。

有人可以帮我吗?任何示例代码都将非常有帮助。

create or replace procedure copy_data(startDate DATE, endDate DATE, 
mainTable varchar2, subTable varchar2, cpyTbl varchar2)
IS

commit_size NUMBER :=1000;
existing_columns NUMBER;
after_deletion_columns NUMBER;
removed_columns NUMBER;


TYPE order_ids IS TABLE OF subTable.id%TYPE INDEX BY PLS_INTEGER;
removable_order_ids order_ids;
bulk_errors EXCEPTION;
PRAGMA EXCEPTION_INIT (bulk_errors, -24381);


CURSOR C1 is select id FROM subTable where ord_id in (select ord_id from 
mainTable where tmstmp BETWEEN startDate AND endDate);
BEGIN

open C1;
LOOP
  FETCH C1 BULK COLLECT INTO removable_order_ids LIMIT commit_size;
   forall indx in 1..removable_order_ids.COUNT 
    INSERT INTO cpyTbl (id, ord_id, name, phon_nbr) 
      select id, ord_id, name, phon_nbr from subTable
      where ord_id =  removable_order_ids(indx)  LOG ERRORS INTO 
      ERR$_cpyTbl('INSERT') REJECT LIMIT UNLIMITED;

  COMMIT;  
 EXIT WHEN removable_order_ids.COUNT < commit_size;
 END LOOP;

COMMIT;

end;

0 个答案:

没有答案