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