create or replace procedure PROC_TC_GE_RegionalManage(old_commno varchar2,new_common varchar2,db_user varchar2  )
  As
  --用于拆分数据库
  --参数说明 old_commno ,原来commno的值,根据old_commno的值将要取出的数据
  --new_common 现在commno的值,如果相等,则不需要修改数据
  --db_user,原来的数据库用户名称
begin
  --迁移TC_GE_RegionalManage
     insert into TC_GE_RegionalManage
     select * from old_sx.TC_GE_RegionalManage;
     if old_commno<>new_common then
        update TC_GE_RegionalManage set commno = new_common;
     end if;     EXCEPTION
        WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('发生错误,迁移TC_GE_RegionalManage数据表数据失败!');
        ROLLBACK;
end PROC_TC_GE_RegionalManage;1)insert into TC_GE_RegionalManage
     select * from old_sx.TC_GE_RegionalManage;
单独执行没有问题,但在过程中,出现00942错误,编译不过去,其中old_sx.是另外一个数据库用户
2)如果把old_sx用户名用参数db_user 代替,如何写?谢谢!!

解决方案 »

  1.   

    用动态SQL撒...看你的要求最好使用merge来做
      

  2.   

    1)首先要确保当前用户对old_sx用户下的表TC_GE_RegionalManage有select权限
    2)可以利用动态语句实现参数传递解决:
    execute immediate 'insert into TC_GE_RegionalManage
        select * from :1' using v_table
      

  3.   

    create or replace procedure PROC_TC_GE_RegionalManage(old_commno varchar2,new_common varchar2,db_user varchar2  )
      As
      --用于拆分数据库
      --参数说明 old_commno ,原来commno的值,根据old_commno的值将要取出的数据
      --new_common 现在commno的值,如果相等,则不需要修改数据
      --db_user,原来的数据库用户名称
    begin
      --迁移TC_GE_RegionalManage
         EXECUTE IMMEDIATE 'insert into TC_GE_RegionalManage select * from  '||db_user||'.TC_GE_RegionalManage a  where a.commno='||old_commno;
         commit;     if old_commno<>new_common then
            update TC_GE_RegionalManage set commno = new_common;
         end if;
         commit;
         EXCEPTION
            WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('发生错误,迁移TC_GE_RegionalManage数据表数据失败!');
            ROLLBACK;
    end PROC_TC_GE_RegionalManage;
    各位!我这样修改后,执行没有问题,但没有数据啊,为什么?怎么办??
      

  4.   

    建议楼主采用PL/SQL的调试功能来调试存储过程,可以对存储过程单步执行
    没数据,我想这句传入的参数是否正确,请检查。另外,确保你现在的用户有对表'||db_user||'.TC_GE_RegionalManage的select权限。
    select * from  '||db_user||'.TC_GE_RegionalManage a  where a.commno='||old_commno; 
      

  5.   

    动态执行时,是没有办法跟踪到动态内容的。
    我怀疑是old_commno是串的问题,缺少引号。
    EXECUTE IMMEDIATE 'insert into TC_GE_RegionalManage select * from  '||db_user||'.TC_GE_RegionalManage a  where a.commno='||''''||old_commno||''''; 
      

  6.   

    SQLERRM为表或视图不存在,但我在sql窗口中执行:
     select * from  old_sx.TC_GE_RegionalManage
    可以查询出数据,为什么?
      

  7.   

    用grant select on old_sx.TC_GE_RegionalManage to sx;后,
    SQLERRM为:ORA-00903表名无效!!
      

  8.   

    --不要ower 
    grant select on TC_GE_RegionalManage to sx;
      

  9.   

    原因找到了:
    select * from  old_sx.TC_GE_RegionalManage a where a.common='001' ;
    或者
    select * from  old_sx.TC_GE_RegionalManage  where old_sx.TC_GE_RegionalManage.common='001' ;
    不行!
    但select * from  old_sx.TC_GE_RegionalManage 可以!
    我怎么写??
      

  10.   

    select * from  old_sx.TC_GE_RegionalManage a where a.common='001' ;
    或者 
    select * from  old_sx.TC_GE_RegionalManage  where old_sx.TC_GE_RegionalManage.common='001' 我记得好像以前也碰到过这种传OWNER参数出错的问题。试下下面这句:
    EXECUTE IMMEDIATE 'insert into TC_GE_RegionalManage select * from  '||db_user||'.TC_GE_RegionalManage  where commno='||old_commno
      

  11.   

    select * from  old_sx.TC_GE_RegionalManage where common='001' 
    在sql中都执行不了?告诉我common无效
      

  12.   

    common是这个表的字段么?common无效说明common不是这个表的字段
      

  13.   

    select * from  old_sx.TC_GE_RegionalManage  where old_sx.TC_GE_RegionalManage.common='001' ; 
    不行! ----------
    字段前面的.太多,建议用别名
      

  14.   

    desc old_sx.TC_GE_RegionalManage
    然后把表结构贴出来看看
      

  15.   

    写了个测试的存储过程,执行没有问题。建议你也把SQL语句打印出来(dbms_output.put_line(var_sql);)看看就知道问题出在哪里了。
    create or replace procedure test_owner_pass(owner in varchar) is
      var_sql varchar(1000);
    begin
      var_sql := 'select * from '||owner||'.dim_disc a where a.disc_id = 50000668';
      execute immediate var_sql;
      dbms_output.put_line(var_sql);
    end test_owner_pass;
      

  16.   

    很明显,楼主没有权限old_sx.TC_GE_RegionalManage表的权限
    先授权,否则存储过程没看不到的,虽然可以在SQL中执行