posts - 23,  comments - 3,  trackbacks - 0
Hi   TOM,  
  I   have   a   problem   with   ref   cursors.I'll   try   to   explain   it(sorry   if   my   english   is    
  not   very   good).  
  I   have   2   databases   and   i   want   to   return   values   from   one   DBto   the   other.  
  In   the   DB   that   i   want   to   recieve   the   data   i   have   the   call(with   a   procedure)   and      
  i   create   a   variable    
  wich   the   type   is   REF   CURSOR   from   the   second   DB.   In   example:  
  --the   variable    
  vResultCursor   user_DB2.pk_k1.vSqlCursorD@DB2;    
  --where   pk1   is   a   package   in   which   i   declare   the   REF   CURSOR   variable  
  ..  
  --The   call  
  user_DB2.pk_k1.P_1@DB2(vResultCursor);  
  --where   P1   is   the   procedure   in   wich   i   open   the   cursor   and    
  after   that   i   want   to   work   with   this   cursor  
   
  loop            
  --vx   is   varchar2              
                  FETCH   vResultCursor   INTO   vx;  
                        EXIT   WHEN   vResultCursor%NOTFOUND;  
                        insert   into   tbl_probe   values   (sysdate,'vx',vx);              
                      commit;                          
             
  end   loop;  
  close     vResultCursor;  
   
  In   the   first   DB   i   have   in   PK_K1   the   declaration   of   the   ref   cursor,   and   the    
  procedure   wich   open   the   dinamic  
    cursor:  
  CREATE     OR   REPLACE   PACKAGE   PK_K1   IS    
  TYPE   vSqlCursorD   IS   REF   CURSOR;  
  PROCEDURE   P_RESOLVECURSOR   (vSQLCURSOR   OUT   vSqlCursorD);  
  END   PK_K1;  
   
  CREATE   OR   REPLACE   PACKAGE   BODY   PK_K1   IS  
   
  PROCEDURE   P_RESOLVECURSOR   (vSQLCURSOR   OUT   vSqlCursorD)   IS  
  vSqlCursortxt   VARCHAR2(4096);  
  BEGIN  
  vSqlCursortxt:=   'SELECT   *   FROM   DUAL';  
  OPEN   vSQLCURSOR   FOR   vSqlCursortxt;  
  EXCEPTION  
                    WHEN   OTHERS   THEN  
                                IF   (vSQLCURSOR%ISOPEN)   THEN  
                                        CLOSE   vSQLCURSOR;  
                              END   IF;  
  END;    
  END   PK_K1;  
  The   problem   that   i   have   is,   that   if   i   make   a   procedure   in   the   package   PK_K1   and    
  i   call   the   procedure   P_RESOLVECURSOR  
  it   works,   but   when   i   call   from   the   other   DB   it   doesnt   work.   The   error   is   ERROR    
  ORA-01001   when   whe   make   the   FETCH  
  I   gave   the   EXECUTE   grant   from   one   DB   to   the   OTHER  
  GRANT   EXECUTE   ON   PK_K1   TO   USERDB1;  
  could   u   help   me?  
  Thanks    
     
   
   
  Followup:  
   
  ref   cursors   cannot   be   used   over   a   dblink   like   that.  
   
   
  http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14261/sqloperations.htm#sthref1448  
   
  ....  
  Note:  
   
          *     Using   a   REF   CURSOR   variable   in   a   server-to-server   RPC   results   in   an    
  error.   However,   a   REF   CURSOR   variable   is   permitted   in   a   server-to-server   RPC   if    
  the   remote   database   is   a   non-Oracle   database   accessed   through   a   Procedural    
  Gateway.  
          *     LOB   parameters   are   not   permitted   in   a   server-to-server   RPC.  
   
  .....    
   
  Passing   a   cursor   from   one   DB   to   the   other     March   23,   2006  
  Reviewer:     Jorge     from   Spain  
   
  Thank   for   the   explanation,   we   solve   the   problem   opening   and   closing   the   cursor    
  in   one   DB   and   passig   the   data   to   the   other   server   in   an   TABLE   Object   by   means   of    
  a   function.  
  Thanks   a   lot     

  ==========================================================
看来这几天的努力白费了,气愤啊
posted on 2009-03-30 16:58 temper 阅读(143) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: