如何在存储过程中使用alter语句?

bluebirdwoo 2005-09-23 02:54:24
在oracle中建立如下存储过程
create or replace procedure MoveTablespace(p_TableName in varchar2, p_TablespaceName in varchar2)
authid current_user is

v_Cursor number;
v_DDLString varchar2(100);
v_NumRows integer;

begin
v_Cursor := dbms_sql.open_cursor;
v_DDLString := 'alter table :Table_Name move tablespace :TablespaceName';
dbms_sql.parse(v_Cursor, v_DDLString, dbms_sql.native);
dbms_sql.bind_variable(v_Cursor, ':TableName', p_TableName);
dbms_sql.bind_variable(v_Cursor, ':TablespaceName', p_TablespaceName);
v_NumRows := dbms_sql.execute(v_Cursor);
dbms_output.put_line(v_NumRows || 'rows affected');
dbms_sql.close_cursor(v_Cursor);
exception
when others then
dbms_output.put_line('exception ocurred');
dbms_sql.close_cursor(v_Cursor);
end;

编译通过,但在sqlplus中执行
exec movetablespace(cjdaold, whcj)
时出错
ERROR 位于第 1 行:
ORA-06550: 第 1 行, 第 22 列:
PLS-00357: 在此上下文中不允许表,视图或序列引用 'CJDAOLD'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

请问怎么解决这个问题啊?
...全文
1018 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
laofang 2005-09-27
  • 打赏
  • 举报
回复
你把你这几行语句写在存储过程中执行试试看
bluebirdwoo 2005-09-27
  • 打赏
  • 举报
回复
我直接运行
begin
execute immediate 'alter table cjdaold move tablespace whcj';
end;
是可以的

这说明有权限
估计是用变量作为表名的问题
wvivw 2005-09-26
  • 打赏
  • 举报
回复
学习
laofang 2005-09-26
  • 打赏
  • 举报
回复
我在自己的机器上测试过没有问题的,你检查一下用户在程序过程中执行alter命令的权限。
HjmaAsC 2005-09-25
  • 打赏
  • 举报
回复
应该在新的表空间中没有权限的缘故吧?或者引用的名称不正确。
bluebirdwoo 2005-09-25
  • 打赏
  • 举报
回复
自己顶一下
哪位大牛帮帮忙啊!
bluebirdwoo 2005-09-23
  • 打赏
  • 举报
回复
我把你写的这个重新编译后
再运行还是出现同样的错误啊
laofang 2005-09-23
  • 打赏
  • 举报
回复
这样就可以:
create or replace procedure MoveTablespace(p_TableName in varchar2,
p_TablespaceName in varchar2)
authid current_user is

v_Cursor number;
v_DDLString varchar2(100);
v_NumRows integer;

begin
v_Cursor := dbms_sql.open_cursor;

v_DDLString := 'alter table ' || p_TableName || ' move tablespace ' || p_TablespaceName;
dbms_output.put_line(v_DDLString);

dbms_sql.parse(v_Cursor, v_DDLString, dbms_sql.native); --v7

v_NumRows := dbms_sql.execute(v_Cursor);

dbms_output.put_line(v_NumRows || 'rows affected');
dbms_sql.close_cursor(v_Cursor);
exception
when others then
dbms_output.put_line('exception ocurred: '||sqlerrm);
dbms_sql.close_cursor(v_Cursor);
end;

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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