oracle删除一些表数据,然后释放表空间的存储过程

createorreplaceproceduretttisbegindeletefrombbbwhere。。。。。。;commit;createtableaaaassel... create or replace procedure ttt is
begin
delete from bbb where。。。。。。 ;
commit;
create table aaa as select * from bbb;
commit;
--删除表bbb所有数据
truncate table bbb;
commit;
--将临时表aaa的数据转移到bbb表中
insert into bbb select * from aaa;
commit;
--删除临时表aaa
drop table aaa;
commit;

但是如果这么做了,编译的时候会报错。
错误:PLS-00103: 出现符号 "CREATE"在需要下列之一时:
begin case declare end
exception exit for goto if loop mod null pragma raise return
select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
行:12
文本:create table temp as select * from EMR_COURSERECORD_LOGO;

commit;
end ttt;

如果把create那个注释掉,truncate也会报错。不知道是为什么。

我用的是oracle 10g。是不是不能在存储过程中加create和truncate呢?大家帮我看看什么问题啊?
我还用execute immediate试了一下,虽然编译通过,但是execute immediate里面的东西是不能运行的。
不需要大家粘贴复制一大堆东西,只需要大家复制到自己的PL/SQL看看,希望能得到完美答复,谢了大家。
谢谢ysyhyt和badkano,我觉得ysyhyt回答应该是对的,不能加动态SQL。
但是问题又来了,你能帮我修改一下我要写的存储过程吗?
因为str:= 'create table '||tname|| '('||c1||' char,'||c2||' char) ';
execute immediate str;
我有点看不懂啊,||是什么意思啊?
展开
 我来答
badkano
推荐于2017-09-23 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144776 获赞数:885365
团长

向TA提问 私信TA
展开全部
create or replace procedure ttt is
begin
delete from bbb where。。。。。。 ;
commit;
execute immediate 'create table aaa as select * from bbb';
commit;
--删除表bbb所有数据
execute immediate 'truncate table bbb';
commit;
--将临时表aaa的数据转移到bbb表中
insert into bbb select * from aaa;
commit;
--删除临时表aaa
execute immediate 'drop table aaa';
commit;
end;

顺便说一句,你之前为什么要delete表bbb里的数据呢?还有,你存储过程里没end
---------补充------
||是用来区分普通字段和变量字段的
他那个写法不和我这个一样吗?

他那个只不过把我单引号里的sql设置成了一个变量,叫str
万山数据
2024-11-14 广告
数据仓库处理是北京万山数据科技有限公司的核心业务之一。我们专注于高效、安全地处理大规模数据,通过先进的数据仓库技术,实现数据的集成、存储、管理和分析。我们的数据仓库解决方案能够支持复杂的数据查询和分析需求,提供实时的数据洞察,助力企业做出更... 点击进入详情页
本回答由万山数据提供
一柒球宝宝
2012-08-07
知道答主
回答量:2
采纳率:0%
帮助的人:2.3万
展开全部
将你要执行的语句拼好赋给一个varchar2变量sql_str,然后Execute Immediate sql_str;commit;
这样就好了,记住每一次execute后都commit一下,要不有的事务是没提交的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gladin
2010-08-25 · 超过24用户采纳过TA的回答
知道答主
回答量:61
采纳率:0%
帮助的人:66.9万
展开全部
||是连接字符串的符号,如果你table name和字段名没有用变量就不用连接,直接写成:

str:='create table test(aa varchar2(10),bb number)';
execute immediate str;

其中test是你要建立的表名,aa和bb是字段名,这个请用你自己的表名和字段名替换.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ysyhyt
2010-08-23 · TA获得超过1507个赞
知道小有建树答主
回答量:1599
采纳率:0%
帮助的人:688万
展开全部
我以前也这样写过,告诉你,存储过程里面只能放动态的sql,不能直接放create 这种东西的。估计truncate也是不能放的。
不管你是10g还是9i,都是不能的。

看我以前写的,以及人家的回答
http://zhidao.baidu.com/question/175832970.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
为战而生在死
2010-08-23 · 超过12用户采纳过TA的回答
知道答主
回答量:88
采纳率:0%
帮助的人:17.7万
展开全部
str:= 'create table '||tname|| '('||c1||' char,'||c2||' char) ';
execute immediate str;
等同于
execute immediate( 'create table t_name ' || '(c1 char,c2 char)');
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式