日期:2014-05-17  浏览次数:21263 次

在存储过程是否可以通过DB_Link调用另外一个数据库的存储过程
我想在存储过程通过已经建立好的DBLINK 去调用远端数据库的存储过程?
存储过程应该如何写?
CREATE OR REPLACE PROCEDURE p_get_bal_detail
(
  in_serviceid IN varchar2,-- 操作码
  in_OpID IN VARCHAR2,-- 操作员代码
  in_contractcode IN VARCHAR2,-- 合同编号,
  In_TRANSACTIONDATE IN VARCHAR2,--赎回日期(某个开放日)
  in_mgr_type IN VARCHAR2,-- 赎回申请 I 新增,U修改
  in_appsheetserialno IN VARCHAR2,-- 如是 U,则非空

  rc1 OUT bssys.tp_cursor,
  rc2 OUT bssys.tp_cursor

) IS
  v_code varchar2(200);
  v_msg varchar2(2000);
  n_sumvol number;
  n_balvol number;
  n_avlvol number;

BEGIN
  OPEN rc1 FOR
  SELECT 0 AS errorcode, '查询成功'
  FROM dual;
  OPEN rc2 FOR
  select test_user.p_hzsg_get_redeembal@TESTDB(in_serviceid,in_OpID,in_contractcode,
  In_TRANSACTIONDATE, 
  in_mgr_type ,
  in_appsheetserialno,
  v_code,
  v_msg,
  n_sumvol,
  n_balvol,
  n_avlvol)
  FROM DUAL;
  --SELECT * FROM test_user.FUNDINFO@TESTDB;
END;
我按上面的写,通不过编译。
p_hzsg_get_redeembal为存储过程名字
test_user 为远端数据库名字
testDB 为databaseLink
SELECT * FROM test_user.FUNDINFO@TESTDB;此语句能查出结果。
证明DatabaseLink是好的。

------解决方案--------------------
倒没试过,关注
------解决方案--------------------
过程中使用dblink是可以的
通不过编译,提示什么错误?
命令行窗口中编译后提示错误时,show errors看看
------解决方案--------------------
通过db_link是可以,但是你是使用所连接的数据库的哪个用户建立的的,需要这个用户有足够的权限才行啊!
------解决方案--------------------
如果不明白我的意思,可以给我联系
------解决方案--------------------
select test_user.p_hzsg_get_redeembal@TESTDB(in_serviceid,in_OpID,in_contractcode, 
In_TRANSACTIONDATE, 
in_mgr_type , 
in_appsheetserialno, 
v_code, 
v_msg, 
n_sumvol, 
n_balvol, 
n_avlvol) 
FROM DUAL; 

1.要注意test_user.p_hzsg_get_redeembal@TESTDB 的返回类型
2.在pl/sql单独call test_user.p_hzsg_get_redeembal@TESTDB 看看能否执行
3. test_user.p_hzsg_get_redeembal@TESTDB 这个函数 在packbody 运行 是要有显式授权的


------解决方案--------------------
可以,首先要保证dblink是可用的。