在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请问怎么解决这个问题啊?
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请问怎么解决这个问题啊?
解决方案 »
- oralce查询速度为什么会变快?
- 为何在oracle9i建表storage (initial 语句无效)
- 请问在ORACLE9i中,有没有PRO*C/C++的GUI预编译工具啊???
- 如何才能提高查询速度?
- ORACLE字段的看似小小问题,但是好像只有高手能够回答!!!!
- 调试存储过程出错,帮忙看看?
- 求救!启动不了enterprise manager console,总是一闪而过……
- 强烈建议增加ORACLE的pro*c专栏!!!
- 奇怪了,关于sequence
- 如何只选取一条记录?
- 请问oracle中case...if怎么用在这里呀????谢了!!!
- 关于 PL/SQL 数组 清空(初始化)
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;
begin
execute immediate 'alter table cjdaold move tablespace whcj';
end;
是可以的这说明有权限
估计是用变量作为表名的问题