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