我想把从SQL SERVER 2000导到ORACLE数据库的表名 全改成大写的 在PL/SQL D...里面写了个脚本 报错 帮我看看 问题出在哪 declare tablename1 varchar2(100);
 cursor c_mycursor is 
  select table_name from all_tab_comments where owner ='system' and table_type = 'table';--取表名字
begin
  open c_mycursor ;
  loop
   begin
  fetch c_mycursor into tablename1;
  rename tablename1 to upper(tablename1);
  exit when c_mycursor%notfound;
   end;
  end loop;end;
上面是我最初的写法 报错 ora-06550 然后我改写成
declare tablename1 varchar2(100);
str varchar2(100);
 cursor c_mycursor is 
  select table_name from all_tab_comments where owner ='system' and table_type = 'table';--取表名字
begin
  open c_mycursor ;
  loop
   begin
  fetch c_mycursor into tablename1;
  str:='rename tablename1 to upper(tablename1)';
  execute immediate str;
  exit when c_mycursor%notfound;
   end;
  end loop;end;
也报错 谁知道应该怎么写

解决方案 »

  1.   

    --修改表名的语句为
    alter table oldname rename to newname;
      

  2.   

    str里的sql不符合语法.
    alter table emp rename to emp1;
    还有就是exit when最好放fetch下面.这样当cursor为空时不会执行execute immediate,避免错误出现.
    declare 
    tablename1 varchar2(100);
    str        varchar2(100);
     cursor c_mycursor is  
      select table_name from all_tab_comments where owner ='system' and table_type = 'table';--取表名字
    begin
      open c_mycursor ;
      loop
      begin
      fetch c_mycursor into tablename1;
      exit when c_mycursor%notfound;
      str:='alter table '|| tablename1||' rename  to '|| upper(tablename1)||'1';
      execute immediate str;
      end;
      end loop;
    end;
      

  3.   

    另外,你的cursor
    cursor c_mycursor is  
      select table_name from all_tab_comments where owner ='SYSTEM' and table_type = 'TABLE';--取表名字
    注意都要大写.
      

  4.   

    'rename tablename1 to upper(tablename1)' 这个不是重命名表的语句吗第一个报错信息 ORA-06550 
    PLS-00103 出现符号“TABLENAME1”在需要下列之一时::=(@第二个报错信息 ora -00933 SQL命令未正确结束
    ora-06512 在LINE 12
      

  5.   

    还有就是你的str里的sql.
    表好像不分大小写的.不能把自己重命名为自己,
    SQL> alter table emp rename to emp;
     
    alter table emp rename to emp
     
    ORA-00955: name is already used by an existing object
     
    SQL> 
      

  6.   

    declare 
    tablename1 varchar2(100);
    str varchar2(100);
     cursor c_mycursor is  
      select table_name from all_tab_comments where owner =upper('system') and table_type =upper('table');--取表名字
    begin
      open c_mycursor ;
      loop
      fetch c_mycursor into tablename1;
      str:='rename tablename1 to upper(tablename1)';
      execute immediate str;
      exit when c_mycursor%notfound;
    end loop;end;
      

  7.   

    我用的ORACLE9I 执行MINITOY的语句 告诉我错误
    非法的ALTER TABLE 选项
      

  8.   


    --其实本身存在oralce 的就是大写的
    declare 
    tablename1 varchar2(100);
    str varchar2(100);
     cursor c_mycursor is  
      select table_name from all_tab_comments where owner =upper('system') and table_type =upper('table');--取表名字
    begin
      open c_mycursor ;
      loop
      fetch c_mycursor into tablename1;
      str:='rename '||tablename1||' to '||upper(tablename1)';
      execute immediate str;
      exit when c_mycursor%notfound;
    end loop;end;
      

  9.   

    我忘记写RENAME了 不好意思 目前提示我 ora-00942 表或者视图不存在  这个问题 我大概知道 因为我从sql server 2000导过来 表名字都带双引号 表名字小写  一般 我在PL/SQL 里面查询 都这样写 select * from system."tablename1" 这个问题该如何处理
      

  10.   

    如果表名为小写,引用表时需要用双引号("")限定。declare 
     tablename1 varchar2(100);
     str varchar2(100);
     cursor c_mycursor is 
      select table_name from all_tab_comments where owner ='SYSTEM' and table_type = 'TABLE';
    begin
      open c_mycursor;
      loop
        fetch c_mycursor into tablename1;
        exit when c_mycursor%notfound;
        if tablename1 <> upper(tablename1) then
          str:='alter table system."'||tablename1||'" rename to '||tablename1;
          execute immediate str;
        end if;
      end loop;
      close c_mycursor;
    end;
    /
      

  11.   

    谢谢 楼上的回答 你的我测试了 好像问题不大了 提示我ora -00955 名称已由现有对象使用
      

  12.   


    你用的是dts 导入的? 是的是要加""
      

  13.   

    三楼的仁兄 你的答案确实是没问题的 14楼的又添加了一些 现在问题是 执行完14楼的提示我ora -00955 名称已由现有对象使用
      

  14.   

    好像可以啊  我在PL/SQL 单独执行 是成功的 alter table t_user rename to T_USER 是可以执行的 执行的没问题  我在数据库了看 是改过来了
      

  15.   

    SQL> alter table emp rename to EMP;
     
    alter table emp rename to EMP
     
    ORA-00955: name is already used by an existing object
     
    SQL> alter table EMP rename to emp;
     
    alter table EMP rename to emp
     
    ORA-00955: name is already used by an existing object
     
    SQL> 
      

  16.   

    我知道问题出在哪了 你的语句里面没加双引号“” 如果加了双引号 就可以执行成功了 因为我的是从sql server 2000导过来的  使用的话 都要加双引号
      

  17.   

    好像可以啊 我在PL/SQL 单独执行 是成功的 alter table system."t_user" rename to T_USER 是可以执行的 执行的没问题 我在数据库了看 是改过来了 我的语句是这样的 上面的粘错了  我觉得还是str:='alter table '|| tablename1||' rename  to '|| upper(tablename1)||'1';
    这块拼接字符串的问题 当然了 上面那个l 我是拷贝3楼的 我也不明白具体代表什么
      

  18.   

    'alter table '|| tablename1||' rename to '|| upper(tablename1)||'1';alter table system.emp rename to emp   是报错的
    所以加个1就 alter table system.emp rename to emp1 就可以
      

  19.   

    晕了 不用UPPER 我怎么把小写的表名称改成大写的呢  我现在都糊涂了 这个问题能不能解决啊 除了手动一条一条解决 还有没有更好的办法
    alter table system."t_user" rename to T_USER 
    像这么写 我要写200多条语句啊 
      

  20.   

    仔细看了下,是这样的.oracle里表名默认是大写的,即使你建表的时候写的是小写也默认转成大写.如果想把表名改成小写,只能 加",类似 alter table emp rename to"emp";
    但是改完后,如果要引用表名时,必须使用"emp",因为oracle会自动转换,如果写emp,会自动转换为EMP,这样跟数据字典比对的时候就没法找到对象.建议非必要情况不要使用"的方式定义表,会给使用造成很大麻烦.
      

  21.   

    谢谢啊  目前情况是 我从SQL SERVER 2000导过来的 全是带""号的 用的那个什么DTS工具好像  我现在的想法就是统一改成 不带引号的 不带引号的 我用的时候就不用加“”了 这样太不方便了 我还要改写30多个存储过程 那样工作量太大了 
      

  22.   

    改成这样应该就可以了declare 
    tablename1 varchar2(100);
    str        varchar2(100);
     cursor c_mycursor is  
      select table_name from all_tab_comments where owner ='system' and table_type = 'table';--取表名字
    begin
      open c_mycursor ;
      loop
      begin
      fetch c_mycursor into tablename1;
      exit when c_mycursor%notfound;
      str:='alter table "'|| tablename1||'" rename  to '|| tablename1;
      execute immediate str;
      end;
      end loop;
    end;
      

  23.   

    恩,有点问题,这样改.
    哦哦,cursor得改下
    declare 
    tablename1 varchar2(100);
    str        varchar2(100);
     cursor c_mycursor is  
      select table_name from user_tables where owner ='system' and table_type = 'table';--取表名字
    begin
      open c_mycursor ;
      loop
      begin
      fetch c_mycursor into tablename1;
      exit when c_mycursor%notfound;
      if tablename1=lower(tablename1) then
      str:='alter table "'|| tablename1||'" rename  to '|| tablename1;
      execute immediate str;
      end if;
      end;
      end loop;
    end;
      

  24.   

    declare 
    tablename1 varchar2(100);
    str        varchar2(100);
     cursor c_mycursor is  
      select table_name from user_tables where owner ='system' ;--用户取你要改的用户
    begin
      open c_mycursor ;
      loop
      begin
      fetch c_mycursor into tablename1;
      exit when c_mycursor%notfound;
      if tablename1=lower(tablename1) then
      str:='alter table "'|| tablename1||'" rename  to '|| tablename1;
      execute immediate str;
      end if;
      end;
      end loop;
    end;
      

  25.   

    scott@SZTYORA> CREATE TABLE "mytb" as select * from emp;表已创建。scott@SZTYORA> desc "mytb";
     名称                                                                                      是否为空? 类型
     ----------------------------------------------------------------------------------------- -------- --------------------------------------
    --------------------
     EMPNO                                                                                              NUMBER(4)
     ENAME                                                                                              VARCHAR2(10)
     JOB                                                                                                VARCHAR2(9)
     MGR                                                                                                NUMBER(4)
     HIREDATE                                                                                           DATE
     SAL                                                                                                NUMBER(7,2)
     COMM                                                                                               NUMBER(7,2)
     DEPTNO                                                                                             NUMBER(2)scott@SZTYORA> DECLARE
      2    cursor c_ur IS select table_name FROM user_tables WHERE table_name<>upper(table_name);
      3    v_oldname varchar2(30); -- 原表的名字
      4    v_newname varchar2(30); -- 更新成新表的名字
      5    v_sql VARCHAR2(100);
      6  BEGIN
      7    v_sql := 'ALTER TABLE :v_oldname RENAME TO :v_newname';
      8    FOR i_cur IN c_ur LOOP
      9      v_oldname := i_cur.table_name;
     10      v_newname := upper(v_oldname);
     11      v_sql := 'ALTER TABLE "'||v_oldname||'"'||' RENAME TO "'||v_newname||'"';
     12      DBMS_OUTPUT.PUT_LINE(v_sql);
     13      EXECUTE IMMEDIATE v_sql;
     14    END LOOP;
     15  END;
     16  /
    ALTER TABLE "mytb" RENAME TO "MYTB"PL/SQL 过程已成功完成。scott@SZTYORA> desc "mytb";
    ERROR:
    ORA-04043: 对象 "mytb" 不存在
    scott@SZTYORA> desc "mytb";
    ERROR:
    ORA-04043: 对象 "mytb" 不存在
    scott@SZTYORA> desc mytb;
     名称                                                                                      是否为空? 类型
     ----------------------------------------------------------------------------------------- -------- --------------------------------------
    --------------------
     EMPNO                                                                                              NUMBER(4)
     ENAME                                                                                              VARCHAR2(10)
     JOB                                                                                                VARCHAR2(9)
     MGR                                                                                                NUMBER(4)
     HIREDATE                                                                                           DATE
     SAL                                                                                                NUMBER(7,2)
     COMM                                                                                               NUMBER(7,2)
     DEPTNO                                                                                             NUMBER(2)scott@SZTYORA>
      

  26.   

    --在你要更改的用户下执行
    declare 
    tablename1 varchar2(100);
    str        varchar2(100);
     cursor c_mycursor is  
      select table_name from user_tables ;
    begin
      open c_mycursor ;
      loop
      begin
      fetch c_mycursor into tablename1;
      exit when c_mycursor%notfound;
      if tablename1=lower(tablename1) then
      str:='alter table "'|| tablename1||'" rename  to '|| tablename1;
      execute immediate str;
      end if;
      end;
      end loop;
    end;
      

  27.   

    -- 注意:必须加个 where 条件排除当表名已经是大写的情况,否则会报错:
                            *
    第 1 行出现错误:
    ORA-00955: 名称已由现有对象使用
      

  28.   


    -- 因为 alter table older_tb rename to new_tb;
    -- 其 older_tb 不能跟 new_tb 的名字完全一样!
      

  29.   

    -- 最后把我执行的代码贴楼主,视楼主好运:
    DECLARE
      cursor c_ur IS select table_name FROM user_tables WHERE table_name<>upper(table_name);
      v_oldname varchar2(30); -- 原表的名字
      v_newname varchar2(30); -- 更新成新表的名字
      v_sql VARCHAR2(100);
    BEGIN
      v_sql := 'ALTER TABLE :v_oldname RENAME TO :v_newname';
      FOR i_cur IN c_ur LOOP
        v_oldname := i_cur.table_name;
        v_newname := upper(v_oldname);
        v_sql := 'ALTER TABLE "'||v_oldname||'"'||' RENAME TO "'||v_newname||'"';
        DBMS_OUTPUT.PUT_LINE(v_sql);
        EXECUTE IMMEDIATE v_sql;
      END LOOP;
    END;
    /-- 注意:必须加个 where 条件排除当表名已经是大写的情况,否则会报错:
                            *
    第 1 行出现错误:
    ORA-00955: 名称已由现有对象使用
      

  30.   

    像你这么写应该是没问题的 我测试了 alter table system."t_user" rename to t_user也是可以完成的 改完之后也是大写的 可是执行你的语句 还是报错 ora-14047 alter table"index rename 不可以与其他分区组合 
    ora-06512 
      

  31.   

    DECLARE
      cursor c_ur IS select table_name FROM user_tables WHERE table_name<>upper(table_name);
      v_oldname varchar2(30); -- 原表的名字
      v_newname varchar2(30); -- 更新成新表的名字
      v_sql VARCHAR2(100);
    BEGIN
      FOR i_cur IN c_ur LOOP
        v_oldname := i_cur.table_name;
        v_newname := upper(v_oldname);
        v_sql := 'ALTER TABLE "'||v_oldname||'"'||' RENAME TO "'||v_newname||'"';
        DBMS_OUTPUT.PUT_LINE(v_sql);
        EXECUTE IMMEDIATE v_sql;
      END LOOP;
    END;
    /-- 注意:必须加个 where 条件排除当表名已经是大写的情况,否则会报错:
                            *
    第 1 行出现错误:
    ORA-00955: 名称已由现有对象使用