在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请问怎么解决这个问题啊?

解决方案 »

  1.   

    这样就可以:
    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;
      

  2.   

    我在自己的机器上测试过没有问题的,你检查一下用户在程序过程中执行alter命令的权限。
      

  3.   

    我直接运行
    begin
    execute immediate 'alter table cjdaold move tablespace whcj';
    end;
    是可以的这说明有权限
    估计是用变量作为表名的问题