Thread: FoxPro Some General Questions/Return cursor from Oracle Stored procedure

Return cursor from Oracle Stored procedure
***This is the code that works
CREATE OR REPLACE PACKAGE Get_today_3 AS
Type RetCursor Is Ref Cursor;
Procedure ReturnCursor
(
   pCursor OUT RetCursor,
   cWarehouse IN detailbohoutput.warehouse%Type,
   cCompany   IN detailbohoutput.company%Type
);
END;
/
show error
CREATE OR REPLACE PACKAGE BODY Get_today_3 AS
Procedure ReturnCursor
(   pCursor OUT RetCursor,
     cWarehouse IN detailbohoutput.warehouse%Type,
     cCompany   IN detailbohoutput.company%Type
  )
IS
Begin
  open pCursor for
    select * FROM detailbohoutput
     where asofdate = trunc(sysdate) -1
       and warehouse = cWarehouse
       and company = cCompany ;
End;
END;
/
show error

А в VFP вызываем эту процедуру:
lcSQL = "{call Get_Today_3.ReturnCursor('" ;
+ lcWarehouse + "', '" + lcCompany + "')}"
lnRetVal = SQLEXEC(nHandle, lcSQL, 'crsMyCurosr')

Как сказано выше - у Вас должен стоять на клиенте ORACLE ODBC driver.

P.S. Взято у "старших братьев" с UT



Еще один пример для разнообразия:
SP in Oracle:
CREATE OR REPLACE PACKAGE GetPermitsByCity AS
Type RetCursor Is Ref Cursor;

Procedure ReturnCursor(pCursor OUT RetCursor, c_city IN permits.city%type);

END;
/
show error
CREATE OR REPLACE PACKAGE BODY GetPermitsByCity AS

Procedure ReturnCursor(pCursor OUT RetCursor, c_city IN permits.city%type) is
Begin
  open pCursor for select * from npdes.permits where city = c_city;
End;
END;
/
show error

Вызов в VFP (обратите внимание, что показано два пути - через SP и непосредственно) собственно это тест на быстродействие
clear
lnHandle = SQLSTRINGCONNECT('Driver=Oracle ODBC Driver;' ;
         + 'UID=myuid;PWD=mypwd;DBQ=ORCL')
lcSQL1 = "{call GetPermitsByCity.ReturnCursor('SOME_CITY')}"
lcSQL2 = "select * from permits where city = 'SOME_CITY'"
?
lnTot = 100
A = 0
B = 0
FOR lnI = 1 TO lnTot
   x = SECONDS()
   lnRetVal = SQLEXEC(lnHandle, lcsql1, 'crsPermits1')
   y = SECONDS()
   lnRetVal = SQLEXEC(lnHandle, lcsql2, 'crsPermits2')
   z = SECONDS()
   A = A + (y - x)
   B = B + (z - y)
ENDFOR
? A, A/lnTot
? B, B/lnTot
SQLDISCONNECT(lnHandle)
RETURN



Ну и, наконец, третий пример:
*****************
*!*   CREATE OR REPLACE PACKAGE my_pkg AS
*!*      TYPE curTyp IS REF CURSOR RETURN myvu%ROWTYPE;
*!*      PROCEDURE open_my_cur (my_cur IN OUT curTyp,
*!*                             choice IN VARCHAR2);
*!*   END my_pkg;
*!*   /
*!*   CREATE OR REPLACE PACKAGE BODY my_pkg AS
*!*     PROCEDURE open_my_cur (my_cur IN OUT curTyp,
*!*                              choice IN VARCHAR2) IS
*!*       BEGIN
*!*       OPEN my_cur FOR  SELECT * from myvu
*!*         where the_key = choice ;
*!*     END open_my_cur;
*!*   END my_pkg;
*!*   /
close all
clear all
release all
clear
oVFPCOM = CreateObject('vfpcom.comutil')
con = createobject("ADODB.Connection")
Rst = createobject("ADODB.RecordSet")
con.Open("DSN=OraHTR;User Id=htr;PASSWORD=wingsof;UID=htr;SERVER=htr")
strSP = "htr.htr_pkg_dev.open_trjn_cur(?, '00000001')"
rst.open(strSP, con, 0, 1, 4)
?rst.fields.count
nError = oVFPCOM.RSToCursor(rst, 'myadocur')
if nError >= 0
   select myadocur
   browse
else
?nError
=aerror(ae)
?'Error Text'
disp memo like ae
?'********************'
rst.close
con.close
close all
clear all
release all
return
*****************
*****************


local nHndl, nSQLResult, noVal, cJobNo, ae
nHndl = sqlconnect("OraDSN")
if nHndl <+ 0
   =aerror(ae)
   disp memo like ae
   sqldisconnect(0)
   return
endif

noVal = ''
nSQLResult = SQLExec(nHndl, "{call usr.my_pkg.open_my_cur (?noVal, '00000001')}","MyCursor")
scatter NAME oSPora
DEBUG
use in MyCursor
* ...


Если не использовать DSN:
Local loConnection,lcConnectString
loConnection = CreateObject("adodb.connection")

With loConnection
lcConnectString = "Provider=MSDAORA.1;Password=mypassword;User ID=myname;Data Source=mydata.forme.com"
.ConnectionString = lcConnectString
.Open
Endwith


loRecordSet = CreateObject("adodb.recordset")

lcCommandText = ;
"GET_CURSOR_PKG.GET_MembershipCursor(?,'2474','3281')"
loRecordSet.Open(lcCommandText,loConnection, 0, 1, 4)

lnRecords = loRecordSet.recordcount

Release all