【问题标题】:Oracle procedure to move tablespace移动表空间的Oracle过程
【发布时间】:2014-08-18 22:45:19
【问题描述】:

朋友... 我正在测试这个 Oracle 过程以将所有表、表空间的索引移动到新表空间......我正在尝试调试和修复这个简单的过程,但它给了我光标错误......有人可以指出我的错误吗?

我可以手动生成一些东西,但那里有 200 个表空间,我计划定期移动这些表空间,因此希望自动执行此任务。

目标:在过程运行时接受旧表空间和新表空间,并使用它将该表空间中的所有对象移动到新表空间。

  1. 我计划执行以下操作:
    1. 在过程运行时接受 old_tbs、new_tbs
    2. 将表 A 从 old_tbs 移动到 new_tbs
    3. 将表 A 的索引重建为 new_tbs
    4. 将表 B 从 old_tbs 移动到 new_tbs
    5. 将表 B 的索引重建为 new_tbs

循环...

CREATE OR REPLACE procedure moveTbl (OldTbs in varchar2, NewTbs in varchar2)
IS

 TblSQL         VARCHAR2(250);

CURSOR curTable (vOwner varchar2, vTblName varchar2, vTbsName varchar2)
IS
   SELECT owner, table_name, tablespace_name
      FROM dba_tables
      WHERE tablespace_name = OldTbs
      ORDER BY 2;

 rec1 curTable%ROWTYPE;

BEGIN
  FOR rec1 IN curTable LOOP

   dbms_output.putline('rec1.owner || rec1.table_name');
     TblSQL := 'alter table '||rec1.owner||'.'||rec1.table_name||' move tablespace '||NewTbs;

  EXECUTE IMMEDIATE TblSQL;

END LOOP;  --curTable for loop

END moveTbl;
/

【问题讨论】:

  • 这可能更适合Database Administrators
  • 你到底得到了什么错误?
  • @Yarsir,错误发布 LINE/COL ERROR -------- ------------- ---------------------------------------- 6/8 PLS-00341:游标声明“CURTABLE”不完整或格式错误 8/4 PL/SQL:SQL 语句被忽略 9/12 PL/SQL:ORA-00942:表或视图不存在 13/7 PL/SQL:项目被忽略 16/3 PL/SQL:语句被忽略 16/15 PLS-00306:调用“CURTABLE”时参数的数量或类型错误
  • @MikeW,从来不知道 dba 部分.. 在那里创建了问题...

标签: oracle procedure


【解决方案1】:

您已将游标声明为具有三个参数,但在 FOR 循环中打开它时未提供任何参数。我建议这个游标不需要任何参数,应该去掉。

也可能是创建此过程的架构/用户无权访问 DBA_TABLES 视图。

编辑

AUTHID CURRENT USER应该紧跟在CREATE OR REPLACE PROCEDURE之后,IS之前,如下图:

CREATE OR REPLACE PROCEDURE moveTbl (OldTbs in varchar2, NewTbs in varchar2)
    AUTHID CURRENT USER
IS
  CURSOR curTable IS
    SELECT owner, table_name, tablespace_name
      FROM dba_tables
      WHERE tablespace_name = OldTbs
      ORDER BY TABLE_NAME;
BEGIN
  FOR rec1 IN curTable LOOP
    dbms_output.putline(rec1.owner || '.' || rec1.table_name);

    EXECUTE IMMEDIATE 'alter table ' || rec1.owner || '.' || rec1.table_name ||
                      ' move tablespace ' || NewTbs;
  END LOOP;  --curTable for loop
END moveTbl;

分享和享受。

【讨论】:

  • 用户可以访问 dba_tables 我已经验证过了。将查看光标参数...谢谢
  • 正如上面提到的@AlexPoole,相关用户的访问权限可能已通过角色授予。要对此进行测试,请执行SET ROLE NONE,然后尝试查询 DBA_TABLES - 如果查询失败,则表明访问权限是通过角色授予的。一种可能的解决方法是将AUTHID CURRENT USER 添加到过程声明中。分享和享受。
  • 是的,亚历克斯,你是对的......在 SET ROLE NONE 用户无法查询 dba_tables 之后(这是新的学习内容)......如何将 AUTHID CURRENT USER 添加到过程声明......
  • @homer:我已经编辑了答案,包括添加了AUTHID CURRENT USER 的过程定义。
  • 感谢和出色的解决方案...我可以正确编译过程,也可以执行 dbms_output.put_line 来打印“alter table table_name move tablespace new_tablespace”但是当它被执行时它会失败并出现 ora-01031:不足特权...我尝试手动运行“alter table move...”命令,但它可以正常工作...所以想知道是否与用户权限或通过过程执行移动表不同?
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2023-01-04
相关资源
最近更新 更多