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 代替,如何写?谢谢!!
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 代替,如何写?谢谢!!
2)可以利用动态语句实现参数传递解决:
execute immediate 'insert into TC_GE_RegionalManage
select * from :1' using v_table
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;
各位!我这样修改后,执行没有问题,但没有数据啊,为什么?怎么办??
没数据,我想这句传入的参数是否正确,请检查。另外,确保你现在的用户有对表'||db_user||'.TC_GE_RegionalManage的select权限。
select * from '||db_user||'.TC_GE_RegionalManage a where a.commno='||old_commno;
我怀疑是old_commno是串的问题,缺少引号。
EXECUTE IMMEDIATE 'insert into TC_GE_RegionalManage select * from '||db_user||'.TC_GE_RegionalManage a where a.commno='||''''||old_commno||'''';
select * from old_sx.TC_GE_RegionalManage
可以查询出数据,为什么?
SQLERRM为:ORA-00903表名无效!!
grant select on TC_GE_RegionalManage to sx;
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 可以!
我怎么写??
或者
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
在sql中都执行不了?告诉我common无效
不行! ----------
字段前面的.太多,建议用别名
然后把表结构贴出来看看
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;
先授权,否则存储过程没看不到的,虽然可以在SQL中执行