我想在存储过程通过已经建立好的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是好的。

解决方案 »

  1.   

    过程中使用dblink是可以的
    通不过编译,提示什么错误?
    命令行窗口中编译后提示错误时,show errors看看
      

  2.   

    通过db_link是可以,但是你是使用所连接的数据库的哪个用户建立的的,需要这个用户有足够的权限才行啊!
      

  3.   

    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 运行 是要有显式授权的
      

  4.   

    可以,首先要保证dblink是可用的。