zoukankan      html  css  js  c++  java
  • 在存储过程中用动态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. /




  • 相关阅读:
    Centos Another app is currently holding the yum lock
    Centos 重置密码
    Effective c#学习笔记(1)
    浅谈计算机编码
    mongodb java spring data
    VS2013 好用的插件
    xml存储bug
    VS 2008 生成操作中各个选项的差别
    程序权限控制
    给钛度产品的一些建议(Note)
  • 原文地址:https://www.cnblogs.com/highroom/p/e7a99102c034cfdb4bdded46543aaaed.html
Copyright © 2011-2022 走看看