oracle 存储过程中动态表名怎么用?

emp_1...10,想输入一个参数,对指定的emp表进行insert,truncate等操作。应该怎么写?一直报错。

create or replace PROCEDURE pro_5(v1 number ) AUTHID CURRENT_USER IS
v_2 number;
begin
v2:= 'emp_'||v1 ;
EXECUTE IMMEDIATE 'TRUNCATE TABLE '||v2 ;
end ;

call pro_5(2);

批量删除可以,代码如下没报错。
create or replace PROCEDURE pro_5(v1 number ) AUTHID CURRENT_USER IS

begin
FOR I IN 1..10
loop
EXECUTE IMMEDIATE 'TRUNCATE TABLE '||I ;
end loop;
end ;

你的存储过程定义中,v2是一个数字类型,而你在赋值语句中却使用了字符串拼接,应该将v2定义为varchar类型。

修改后的代码应该为:

create or replace PROCEDURE pro_5(v1 number ) AUTHID CURRENT_USER IS
v_2 varchar(20);
begin
v2:= 'emp_'||v1 ;
EXECUTE IMMEDIATE 'TRUNCATE TABLE '||v2 ;
end ;

call pro_5(2);

这样才能正确执行动态表名的操作。

1.v_2本身是个number型,没法存字符串,这里就报错了
2.v1也是number型,拼接之前应该先强制转换成varchar
v_2 varchar(20);
begin
v2:= 'emp_'||to_char(v1) ;