数据库高手们,早上好,现在我遇到了这样一个问题,我现在要从oracle数据库A里执行存储过程调用Oracle数据库B里的表Info里的数据,现在我配置了本地数据库服务器的tnsnames.ora文件,创建的 database link名为 test 
我用 普通的语句,select * from Info@test 可以从数据库B里查询得到表info的信息,
但是我用存储过程
create proc GetVehicleInfo
AS
select * from Info@test 
却得不到信息。能高手我为什么么?

解决方案 »

  1.   

    存储过程中好像不能直接这样获取查询的结果,貌似要借助游标之类的东西。和SQl Server的差别还是挺大的。参考
    如何在oracle存储过程中返回查询结果集
      

  2.   

    需要使用游标返回数据集才可以的。cursor 先创建一个包
      

  3.   

    给你个例子。create or replace procedure pro_hd_select_log
    (
      p_cursor_log in out system.pkg_hd_user.user_rc_type
    )
    /*取得所有日志信息*/
    as
    begin
     open p_cursor_log for
    select  iLogID,cUserAccount,cDescription,cLoginIP,dLoginDate,dLsatUP,iDel
    from HD_Log
    where
    /*当iDel为1时为显示,为0表示已经删除*/
     iDel=1;
     end pro_hd_select_log;
      

  4.   

    恩,使用cursor返回对方过程的语句(从dba_source视图),然后动态创建.
      

  5.   


    create proc GetVehicleInfo (rs OUT sys_refcursor)
    AS
    BEGIN
     OPEN rs FOR 'select * from Info@test';
    END;
    /DECLARE 
    ref_cur sys_refcursor;
    rs test%rowtype;
    BEGIN
         GetVehicleInfo(ref_cur);
         LOOP
            FETCH ref_cur INTO rs ;
                  EXIT WHEN ref_cur%NOTFOUND;
            Dbms_Output.put_line(rs.ename);
         END LOOP;
         CLOSE ref_cur;
    END;
      

  6.   

    上面创建过程该下:
    create procedure GetVehicleInfo (rs OUT sys_refcursor)
    AS
    BEGIN
     OPEN rs FOR 'select * from Info@test';
    END;我的测试案例:CREATE PROCEDURE GetVehicleInfo (rs out sys_refcursor)
    AS
    BEGIN
     OPEN rs FOR 'select * from emp where rownum=1';
    END;
    /
    DECLARE 
    rs sys_refcursor;
    rs_test emp%rowtype;
    BEGIN
         GetVehicleInfo(rs);
         LOOP
         FETCH rs INTO rs_test ;
            EXIT WHEN rs%NOTFOUND;
         Dbms_Output.put_line('NAME='||rs_test.ename);
         END LOOP;
    END;
    /结果:47  PL/SQL block, executed in 0 sec.
        NAME=SMITH                           
        Total execution time 0.016 sec.