ORACLE数据库创建动态表

最近公司一个项目代码里的定时任务无法执行,查验代码良久,奈何代码过于老旧,开发人员换了一茬又一茬,现在都无法理清,故无奈只好到数据库里重新写存过,配置定时任务。

在写存过时,由于检测及安全性能要求,需要备份数据,设计是每次调用存过时就创建一张新表记录历史数据,开始时是准备直接一条语句搞定:

BEGIN
 execute immediate 'create table tmp_a_'||to_char(sysdate, 'yyyymmdd')||' as select * from a';

END;

但是执行时报错,找了良久未发现问题所在,自己怀疑是拼接表名时字符串的问题,所以我调整了一下上面的语句:

is
tableName varchar2(30);
BEGIN
  tableName :='tmp_a_'||to_char(sysdate,'yyyymmdd' );
 execute immediate 'create table ' || tableName  ||' as select * from a';

END;

这样就可以了,能够执行成功,问题也完美解决!

PS:在存过里执行create语句时,有时会报“权限不足!”,这是因为Oracle8i及其后的版本,Oracle引入调用者(invoker)权限,使得对象可以以调用者身份和权限执行。遇到存储过程中带有Create Table的这种情况,通常解决方法是进行显式的系统权限: grant create table to username;但是,此方法太笨,因为有可能执行一个存储过程,需要很多不同权限(oracle对权限划分粒度越来越细)。最好的方法是,利用 oracle 提供的方法,在创建存储过程时,加入 Authid Current_User 条件进行权限分配。

create or replace procedure p_test Authid Current_User 
is
begin
  execute immediate 'create table tmp(id number(1))';
end p_test;

分享一下,希望能帮到和我一样遇到此类问题的道友们!

猜你喜欢

转载自www.cnblogs.com/wanghhe/p/9713938.html