oracle 存储过程中调用truncate命令。

本文介绍了如何在Oracle 10g环境中使用存储过程调用TRUNCATE命令清空表数据,包括基本调用方法、对表上对象的影响以及使用命名过程的示例。通过示例展示,TRUNCATE操作不会影响到表上的对象状态,例如存储过程。

数据库版本:

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod
PL/SQL Release 10.1.0.2.0 - Production
CORE 10.1.0.2.0 Production
TNS for 32-bit Windows: Version 10.1.0.2.0 - Production
NLSRTL Version 10.1.0.2.0 - Production



基本调用方法:
begin
EXECUTE IMMEDIATE 'truncate table test.t';
end;

测试:
SQL> conn test/test
已连接。
SQL> select * from t;

未选定行

SQL> desc t
名称
--------------------------------------------------
OWNER
OBJECT_NAME
SUBOBJECT_NAME
OBJECT_ID
DATA_OBJECT_ID
OBJECT_TYPE
CREATED
LAST_DDL_TIME
TIMESTAMP
STATUS
TEMPORARY
GENERATED
SECONDARY

SQL> insert into t select * from all_objects;

已创建47382行。

SQL> commit;

提交完成。

SQL> begin
2 EXECUTE IMMEDIATE 'truncate table test.t';
3 end;
4 /

PL/SQL 过程已成功完成。

SQL> select count(*) from t;

COUNT(*)
----------
0
测试之二,truncate操作对表上的对象有没有影响?
创建一个测试过程:
create or replace procedure test
2 as
3 a varchar2(40);
4 begin
5 select object_name into a from t;
6 dbms_output.put_line(a);
7* end;
SQL> /

过程已创建。

SQL> alter procedure test compile;

过程已更改。

SQL> insert into t
2 select * from all_objects
3 where rownum<21;

已创建20行。

SQL> commit;

提交完成。

SQL> select owner,object_name,object_type,status from dba_objects
2 where object_name='TEST';

OWNER
------------------------------
OBJECT_NAME
--------------------------------------------------------------------------
OBJECT_TYPE STATUS
------------------- -------
TEST
TEST
PROCEDURE VALID
SQL> begin
2 EXECUTE IMMEDIATE 'truncate table test.t';
3 end;
4 /

PL/SQL 过程已成功完成。

SQL> select * from t;

未选定行

SQL> select owner,object_name,object_type,status from dba_objects
2 where object_name='TEST';

OWNER
------------------------------
OBJECT_NAME
------------------------------------------------------------------------------
OBJECT_TYPE STATUS
------------------- -------
TEST
TEST
PROCEDURE VALID

执行truncate操作后,过程test的状态依然有效。


测试之三,使用命名过程。
SQL> create or replace procedure truct
2 as
3 begin
4 EXECUTE IMMEDIATE 'truncate table test.t';
5 end;
6 /

过程已创建。

SQL> alter procedure truct compile;

过程已更改。

SQL> insert into t
2 select * from dba_objects
3 where rownum<31;

已创建30行。

SQL> commit;

提交完成。

SQL> select count(*) from t;

COUNT(*)
----------
30

SQL> execute truct;

PL/SQL 过程已成功完成。

SQL> select count(*) from t;

COUNT(*)
----------
0


SQL> select owner,object_name,object_type,status from dba_objects
2 where object_name='TEST';

OWNER
------------------------------
OBJECT_NAME
--------------------------------------------------------------------------
OBJECT_TYPE STATUS
------------------- -------
TEST
TEST
PROCEDURE VALID
SQL>

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9599/viewspace-472976/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9599/viewspace-472976/

<think>好的,用户的问题是关于如何在SQL存储过程中正确使用TRUNCATETABLE语句。我需要结合提供的引用资料来回答这个问题。首先,根据引用[1],Oracle存储过程中直接使用TRUNCATE会报错,必须通过EXECUTE IMMEDIATE来执行。这说明不同的数据库可能有不同的处理方式,但用户可能是在问通用的方法,或者特定于某个数据库系统,比如MySQL或Oracle。接下来,引用[2]和[3]提到MySQL中的存储过程可以调用TRUNCATETABLE,但需要DROP权限。这说明权限问题很重要,用户可能需要检查他们的权限设置。同时,引用[4]强调了TRUNCATE的高效性,但要注意它和DELETE的区别,比如事务日志和触发器的触发情况。 用户可能遇到的问题包括权限不足、语法错误,或者不理解为什么不能在存储过程中直接使用TRUNCATE。需要分步骤解释,首先说明TRUNCATE存储过程中的使用限制,然后给出具体数据库系统的解决方法,比如Oracle使用动态SQL,而MySQL可能需要显式的权限。此外,还要提醒用户注意事务控制和数据恢复的问题,因为TRUNCATE不能回滚,而DELETE可以。 另外,用户可能没有明确说明使用的数据库类型,但根据引用中提到的Oracle和MySQL,应该分别给出这两种系统的示例。同时,生成相关问题时要考虑用户可能的后续疑问,比如权限问题、性能比较、替代方法等。</think>在SQL存储过程中使用`TRUNCATE TABLE`语句需要注意权限、语法和数据库特性。以下是具体实现方法: ### 一、存储过程中使用TRUNCATE的步骤 1. **权限要求** - 需要`DROP`权限(MySQL)或`ALTER TABLE`权限(Oracle)[^3][^1] - 普通用户可能需要管理员单独授权 2. **语法格式** - **MySQL示例**: ```sql CREATE PROCEDURE clear_table() BEGIN TRUNCATE TABLE temp_data; -- 直接调用 END; ``` - **Oracle示例**: ```sql CREATE PROCEDURE clear_table IS BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE temp_data'; -- 动态SQL执行[^1] END; ``` 3. **与DELETE的区别** - `TRUNCATE`重置表计数器,`DELETE`保留自增ID[^3] - `TRUNCATE`不触发触发器,`DELETE`会触发[^4] - 事务中`TRUNCATE`不可回滚(MySQL),`DELETE`可回滚[^4] ### 二、常见错误解决方案 1. **权限不足报错** ```sql GRANT DROP ON database.table TO 'user'@'host'; -- MySQL授权 GRANT ALTER ANY TABLE TO username; -- Oracle授权 ``` 2. **语法错误处理** ```sql -- Oracle必须使用动态SQL BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE audit_log'; END; ``` 3. **事务控制示例** ```sql START TRANSACTION; CALL clear_table(); -- 调用存储过程 ROLLBACK; -- 仅对DELETE有效,TRUNCATE无法回滚[^4] ``` ### 三、应用场景对比 | 操作 | 数据量 | 速度 | 事务支持 | 触发器 | |-----------|-----|------|------|-----| | TRUNCATE | 大 | 快10倍 | 无 | 不触发 | | DELETE | 小 | 慢 | 支持 | 触发 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值