ORACLE存储过程中,可以动态创建表么?(表名跟当前时间有关)

时间:2021-10-11 09:25:00
如题:
我的code如下:

create or replace procedure g_test is
begin
tab_name varchar2(20);
SQL_STR varchar2(100);

select sysdate into tab_name from dual;

SQL_STR := 'create table ' || 'username.temp_' || substr(tab_name,1,2) || ' (no int)';

EXECUTE IMMDIATELY SQL_STR;

end g_test;

在命令行中调用该存储过程时却报没有权限,这是什么原因呢?正确的code应该是什么样的呢?

9 个解决方案

#1


重新拿管理员的权限给当期用户赋创建表的权限

#2


你的当前用户授权是不是 直接grant dba to <用户> 搞定的

如果是  grant create any table to <用户>,然后再运行就可以了

#3


你建立和调用时同一个用户?如果不是调用的那个用户应该要有execute any procedure 系统权限的

#4


我在自己的用户名下创建表,直接create username.temp_20120221是可以创建的,为什么存储过程中就不行喃?

#5


引用 4 楼 zheyimiao 的回复:
我在自己的用户名下创建表,直接create username.temp_20120221是可以创建的,为什么存储过程中就不行喃?


封装体内需要直接权限 封装体外只需要间接权限。

#6


那直接权限,只需要创建我的用户名下的表,这怎么赋权限呢
grant create any table to <用户>,这样的话是不是把其他用户名下的表的创建权限也给我了?
引用 5 楼 forgetsam 的回复:
引用 4 楼 zheyimiao 的回复:
我在自己的用户名下创建表,直接create username.temp_20120221是可以创建的,为什么存储过程中就不行喃?


封装体内需要直接权限 封装体外只需要间接权限。

#7


up,up,up

#8


使用sys用户
执行 grant create table to <用户>;
然后再执行你的procedure。

#9


这样的话,我是不是有不止是我用户下的建表权限,还有了在别的用户下的建表权限呢?
引用 8 楼 renfengjun 的回复:
使用sys用户
执行 grant create table to <用户>;
然后再执行你的procedure。

#1


重新拿管理员的权限给当期用户赋创建表的权限

#2


你的当前用户授权是不是 直接grant dba to <用户> 搞定的

如果是  grant create any table to <用户>,然后再运行就可以了

#3


你建立和调用时同一个用户?如果不是调用的那个用户应该要有execute any procedure 系统权限的

#4


我在自己的用户名下创建表,直接create username.temp_20120221是可以创建的,为什么存储过程中就不行喃?

#5


引用 4 楼 zheyimiao 的回复:
我在自己的用户名下创建表,直接create username.temp_20120221是可以创建的,为什么存储过程中就不行喃?


封装体内需要直接权限 封装体外只需要间接权限。

#6


那直接权限,只需要创建我的用户名下的表,这怎么赋权限呢
grant create any table to <用户>,这样的话是不是把其他用户名下的表的创建权限也给我了?
引用 5 楼 forgetsam 的回复:
引用 4 楼 zheyimiao 的回复:
我在自己的用户名下创建表,直接create username.temp_20120221是可以创建的,为什么存储过程中就不行喃?


封装体内需要直接权限 封装体外只需要间接权限。

#7


up,up,up

#8


使用sys用户
执行 grant create table to <用户>;
然后再执行你的procedure。

#9


这样的话,我是不是有不止是我用户下的建表权限,还有了在别的用户下的建表权限呢?
引用 8 楼 renfengjun 的回复:
使用sys用户
执行 grant create table to <用户>;
然后再执行你的procedure。