存储过程可以这么写么?

guodong66 2010-05-16 04:53:59
这样可以不?


EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP is select * from T_GROUP';


如果不可以难道只能 先建立表 然后 每条insert ??
...全文
216 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharpidd 2010-05-18
  • 打赏
  • 举报
回复
create or replace procedure sp_cr authid current_user
as
begin
EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP as select * from T_GROUP';
end;

前提是当前用户有建表和建存储过程的的权限。
报insufficient privileges肯定就是没有足够的权限.
guodong66 2010-05-17
  • 打赏
  • 举报
回复
语句粘贴出来可以执行,说明不是建表权限的问题。
guodong66 2010-05-17
  • 打赏
  • 举报
回复
我试下,OK 就结贴。
ojuju10 2010-05-17
  • 打赏
  • 举报
回复
楼主登陆的用户没有建表的权限
codearts 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 vber1010 的回复:]
SQL code

create or replace procedure sp_cr authid current_user
is
begin
EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP as select * from T_GROUP';
end;

前提是当前用户有create table 的权限。
[/Quote]

权限问题,用这楼的方法解决。 2个名词:调用者权限、定义者权限,可以搜一下
RunCanRun 2010-05-17
  • 打赏
  • 举报
回复
EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP is select * from T_GROUP';

兄弟提示一下:把语句中的is 修改成 as 就可以了,祝您好运
Adebayor 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guodong66 的回复:]

改成 AS 后 报 insufficient privileges
[/Quote]
这个错误很显然 权限不足呀!!!
要不使用sys用户 执行下 看看什么效果
begin
EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP as select 1 from 你的表所属于的用户.T_GROUP where 1 >2';
end;
就这样执行
Adebayor 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 guodong66 的回复:]
v_sql:='CREATE TABLE T_GROUP_TEMP is select * from T_GROUP'
EXECUTE IMMEDIATE v_sql;
[/Quote]
看看你的这种写法根本就通不过的
SQL> desc dd;
Object dd does not exist.

SQL>

SQL>
SQL> declare
2 v_sql varchar2(100);
3 begin
4 v_sql := 'create table dd is select * from dual';
5 execute immediate v_sql;
6 end;
7 /

declare
v_sql varchar2(100);
begin
v_sql := 'create table dd is select * from dual';
execute immediate v_sql;
end;

ORA-00922: 选项缺失或无效
ORA-06512: 在 line 6

显然 is必须改成as
Adebayor 2010-05-17
  • 打赏
  • 举报
回复
Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0
Connected as scott

SQL> desc d;
Object d does not exist.

SQL>
SQL> begin
2 execute immediate 'create table d as select * from dual';
3 end;
4 /

PL/SQL procedure successfully completed

SQL> select * from d;

DUMMY
-----
X

Alessandro_ 2010-05-16
  • 打赏
  • 举报
回复


grant create,resourc to user;
Alessandro_ 2010-05-16
  • 打赏
  • 举报
回复



应该要 把is改成as!
vber1010 2010-05-16
  • 打赏
  • 举报
回复


create or replace procedure sp_cr authid current_user
is
begin
EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP as select * from T_GROUP';
end;
前提是当前用户有create table 的权限。
小灰狼W 2010-05-16
  • 打赏
  • 举报
回复
...晕了.这个是本用户下的表的话不会有查询权限问题
看下有没有建表权限,或者该表空间上有配额限制。如果建表权限是包含在某个角色里的话,用grant create table.. 对该用户显式授权
小灰狼W 2010-05-16
  • 打赏
  • 举报
回复
is要改成as,否则有语法错误
insufficient privileges说明权限不足
T_GROUP上的查询权限,或者是建表权限
假设当前用户名为user1,先登录具有dba权限的用户,执行
grant create table to USER1;
grant select on t_group to USER1;
然后再登录user1执行过程
guodong66 2010-05-16
  • 打赏
  • 举报
回复
下班回家了,明天来看,看到的帮帮忙,我肯定结贴(虽然分不多)
guodong66 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 adebayor 的回复:]

引用楼主 guodong66 的回复:
这样可以不?

SQL code

EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP is select * from T_GROUP';



如果不可以难道只能 先建立表 然后 每条insert ??

这样写可以 不过最少要加上begin end
错误信息说明你没有权限 可能是建表……
[/Quote]

很确定权限是有的,
v_sql:='CREATE TABLE T_GROUP_TEMP is select * from T_GROUP'
EXECUTE IMMEDIATE v_sql;


这样时 v_sql的值粘贴出来执行是正确的
Adebayor 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 guodong66 的回复:]
这样可以不?

SQL code

EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP is select * from T_GROUP';



如果不可以难道只能 先建立表 然后 每条insert ??
[/Quote]
这样写可以 不过最少要加上begin end
错误信息说明你没有权限 可能是建表 或者是对T_GROUP的查询权限
oraclemch 2010-05-16
  • 打赏
  • 举报
回复
EXECUTE IMMEDIATE 'CREATE TABLE T_GROUP_TEMP as select * from T_GROUP';

guodong66 2010-05-16
  • 打赏
  • 举报
回复
改成 AS 后 报 insufficient privileges
zhangwonderful 2010-05-16
  • 打赏
  • 举报
回复
要给当前用户分配create any table权限
加载更多回复(4)

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧