+ -
当前位置:首页 → 问答吧 → dblink 跨数据库报错

dblink 跨数据库报错

时间:2011-11-04

来源:互联网

如果但就执行
insert into bonus nologging (ename) select ename from scott.bonus@linkehr;
commit
是没错的

但是我放到存储过程中,拼接语句执行时会报错
ORA-00942: 表或视图不存在
ORA-02063: 紧接着 line (起自 LINKEHR)


这是存储过程
CREATE OR REPLACE package body SCOTT.iniData 
is 
  procedure iniEhr(  
p_ehrtable in varchar2,
p_ehrcol in varchar2,
p_kimstable in varchar2,
p_kimscol in varchar2

  is 
  v_sql varchar2(2000):='';
  begin 
  v_sql:='insert into '||p_kimstable||' nologging ('||p_kimscol||')select '||p_ehrcol||' from '||p_ehrtable||'@linkehr';

EXECUTE IMMEDIATE v_sql;
commit;

  end; 
   
end iniData;
/


为什么会这样?

作者: ice9ying   发布时间: 2011-11-04

使用直接权限赋予grant select, insert on 。。。 to user;
或者尝试用调用者权限模式authid current user

作者: bsh_ly   发布时间: 2011-11-04

v_sql:='insert into '||p_kimstable||' nologging ('||p_kimscol||')select '||p_ehrcol||' from '||p_ehrtable||'@linkehr';

打印出来看看,是否拼接正确

2 执行动态语句是否拥有访问LINK的权限?建立LINK是PUBLIC的?

作者: java3344520   发布时间: 2011-11-04

存储过程中需要对调用表进行显示赋权。
同时你的sql
select ename from scott.bonus@linkehr;
前面的 scott 没有必要加,因为dblink中应该有连接的用户名和密码。

作者: BenChiM888   发布时间: 2011-11-04

引用 3 楼 benchim888 的回复:
存储过程中需要对调用表进行显示赋权。


我对oracle不熟,怎么做?

作者: ice9ying   发布时间: 2011-11-04

引用 3 楼 benchim888 的回复:
存储过程中需要对调用表进行显示赋权。
同时你的sql
select ename from scott.bonus@linkehr;
前面的 scott 没有必要加,因为dblink中应该有连接的用户名和密码。

正解

作者: yejihui9527   发布时间: 2011-11-04

引用 5 楼 yejihui9527 的回复:
引用 3 楼 benchim888 的回复:
存储过程中需要对调用表进行显示赋权。

正解


HOW??????

作者: ice9ying   发布时间: 2011-11-04

你这个包是建在 SCOTT.iniData 下面的,scott下面存在表 bonus 么?


引用 4 楼 ice9ying 的回复:
引用 3 楼 benchim888 的回复:
存储过程中需要对调用表进行显示赋权。


我对oracle不熟,怎么做?

作者: BenChiM888   发布时间: 2011-11-04

热门下载

更多