在存储过程中用动态SQL建表后如果用PL/SQL插入

      请教各位老师一个问题,如果想把一个表的建立并插入数据放到一个存储过程中,应该要怎么处理呢,如果插入数据的表在存过中插入数据之前未建立,存储过程会报错提示表不存在,导致存储过程失效,有没有什么变通的办法呢?
 
      之所以不在存储过程之外建表是想定时执行这个存储过程,如果存在表被DROP的情况,就会导致存储过程插入数据报错了,所以想在存储过程中自动把表的建立和处理一起考虑了,插入数据不考虑使用动态SQL来插入,因为这样的话就不能使用plsql的东西了(比如远程链接优化的提示),请教怎么处理,谢谢啦!
 
简单来说,就是要怎么实现在一个过程或包中,建表并插入,而插入不能是动态sql,
 
比如这样的情况,如果表不存在存储过程应付报错失效
  1. CREATE OR REPLACE PROCEDURE y_p_test AS
  2. BEGIN
  3. drop_table('y_test');
  4. EXECUTE IMMEDIATE ' create table y_test (id number, name varchar2(20)) ';
  5. FOR i IN (SELECT/*+driving_site(b) */ * FROM small_tab_local a, big_tab_remote@remote b
  6. WHERE a.sub_id=b.sub_id AND a.acc_id=b.acc_id)
  7. LOOP
  8. INSERT INTO y_test VALUES i;
  9. END LOOP;
  10. COMMIT;
  11. END;
已想到一个解决办法了,经测试有效,思路就是用一个存过来DROP表后创建,再用一个存过来插入数据,然后再用一个存过通过动态SQL的方式先后调用这2个存过,由于动态SQL是执行时才进行判断,所以能顺利执行,供大家参考
  1. create or replace procedure drop_table(x varchar2) as
  2. table1 number;
  3. begin
  4. select COUNT(*) INTO table1 from user_tables where table_name=upper(x);
  5. if table1 > 0
  6. then execute immediate 'drop table '||x;
  7. end if;
  8. end;
  9. /
  10. CREATE OR REPLACE PROCEDURE y_p_test0
  11. AS
  12. BEGIN
  13. drop_table('y_test');
  14. EXECUTE IMMEDIATE 'create table y_test as select * from fzt_dd where 1=2';
  15. END;
  16. /
  17. CREATE OR REPLACE PROCEDURE y_p_test AS
  18. BEGIN
  19. FOR i IN (SELECT * FROM fzt_dd WHERE ROWNUM<10)
  20. LOOP
  21. INSERT INTO y_test VALUES i;
  22. END LOOP;
  23. COMMIT;
  24. END;
  25. /
  26. CREATE OR REPLACE PROCEDURE y_p_test1 AS
  27. BEGIN
  28. EXECUTE IMMEDIATE 'begin y_p_test0; end;';
  29. EXECUTE IMMEDIATE 'begin y_p_test; end;';
  30. END;
  31. /




原文地址:https://www.cnblogs.com/highroom/p/e7a99102c034cfdb4bdded46543aaaed.html