在存储过程中用动态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, [email protected] 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. /

来自为知笔记(Wiz)

时间: 2024-10-25 22:11:20

在存储过程中用动态SQL建表后如果用PL/SQL插入的相关文章

oracle问题:新建了一个PDM文件,建表后生成的sql语句中含有clustered

问题描述 为了在oracle中新增表,在PDM中建表,使用其生成的sql语句,但是建表不能成功,提示 ORA-00906: 缺失左括号 原因是多了clustered 关键字 情景重现 1. 新建一个pdm文件 2. 建表后预览sql 是有clustered 这个关键字的 3. 建表时报错 问题解决 调查发现数据库的问题,右键数据库属性 查看DBMS 发现是 SQL SERVER ! 解决办法就是切换DBMS: 点击确定 再次查看sql语句,一切正常.问题最终解决.

[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下) ——通过知识共享树立个人品牌. 继上六篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程之四:把游标说透(

[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ——通过知识共享树立个人品牌. 继上五篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不

用PL/SQL建表

首先,建表之前,在心里一定要对你即将要建的表的用处要明确,本人要说的是在pl/sql上来操作, 在oracle中建表SQL如下: create table 要创建的表名 ( 字段1   字段1的类型(比如varchar,num等等,且字段类型后加括号,括号里写上限定位数), 字段2   字段2的类型, 字段3   字段3的类型, ........ ) 注:数据库中大小写不区分,但是字段类型不一样时,有时需要加上引号,其次,如果其中的某个字段需要设置为主键的话,需要在字段类型后面加上primary

开发PL/SQL子程序和包及使用PL/SQL编写触发器、在JDBC中应用Oracle

1.  子程序的各个部分: 声明部分.可执行部分.异常处理部分(可选) 2.子程序的分类: A.  过程 - 执行某些操作 a.  创建过程的语法: CREATE [OR REPLACE]  PROCEDURE  <procedure name> [(<parameter list>)]  IS|AS <local variable declaration> BEGIN <executable statements> [EXCEPTION <excep

MUI全国城市区县级联json转换sql建表

最近试水hbuilder,使用html5+和Mui结合实现手机App开发. 这一套开发体系是Dcloud创建的,核心是提供了一套全html5+js实现手机APP端的开发(所谓的移动App)方案,以区别传统的webview实现的“Mobile web”,可谓html5的自我颠覆,左右互博——看起来像是自己否定了web实现手机开发的思路,阉割了web在B/s上面的优势,而仅仅用html5+js来作为app开发语言,亮点在于可以用hbuilder自助打包成apk和ipa,解决了原生html5实现web

建表时和建表后的级联更新和删除

--对表建立级联更新或级联删除方法--1.在建表时直接定义级联更新和级联删除create table pktable(ID int primary key,SCD int, SName varchar(20)) create table fktable(ID int primary key,SCD int references pktable(ID) on delete cascade on update cascade, Age tinyint) insert into pktable val

SQL 建表与查询 HTML计算时间差

create database xue1 go --创建数据库 use xue1 go --引用数据库 create table xinxi ( code int, name varchar(20), xuehao decimal(10), brithday decimal(10), ) --创建信息表 insert into xinxi values(1,'张三',2016042701,2016-4-27) insert into xinxi values(2,'李四',2016042702,

sql建表常用语句

--删除主键 alter table 表名 drop constraint 主键名 --添加主键 alter table 表名 add constraint 主键名 primary key(字段名1,字段名2--) --添加非聚集索引的主键 alter table 表名 add constraint 主键名 primary key NONCLUSTERED(字段名1,字段名2--) 新建表: create table [表名] ( [自动编号字段] int IDENTITY (1,1) PRIM