powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
20 сообщений из 20, страница 1 из 1
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33443445
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если может, то как ?

Код: plaintext
1.
2.
3.
4.
5.
6.
SQLString = ;
    "create or replace function myfunc return number " ;
    + "as " ;
    + "begin " ;
        + "return 5; " ;
    + "end; "
=SQLEXEC(hConn, SQLString, "MyCursor")

это, слава Богу, получается, но как сделать функцию, которая возвращала бы курсор ?

(я работаю с Oracle 8i и VFP 8 SP1)

спасибо заранее
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33443461
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, разве так не работает:
Код: plaintext
1.
2.
3.
SQLString = ;
    "select * from mytable; "
=SQLEXEC(hConn, SQLString, "MyCursor")
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33443480
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошу прощения за неразбериху, я хтел сказать, что:
Код: plaintext
1.
2.
SQLString = ;
    "select myfunc() from dual"
=SQLEXEC(hConn, SQLString, "MyCursor")

, но что делать, если я создам функцию типа

Код: plaintext
1.
2.
3.
4.
5.
create or replace function myfunc (id number) return number
is
begin
select a.* into ??? from mytable a where a.id = id;
return ???
end;

(вместо вопросов должно быть что-то, но я не знаю что)

вот. что мне сделать, чтобы потом получить этот селект с помощью SQLEXEC() ?
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33443560
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--
Код: plaintext
1.
2.
3.
4.
5.
create or replace function myfunc (id number) return number
is
begin
select a.* into ??? from mytable a where a.id = id;
return ???
end;


вместо вопросов в селекте должен быть перечень задекларированных предварительно переменных... и курсор в Оракле, к сожалению не то же самое, что курсор в Фоксе...
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33443585
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это понятно, что фокс и оракл разные вещи..

ладно, допустим, я напишу в селекте перечень задекларированных предварительно переменных, но я же не смогу их все вернуть одним return-ом.

наверняка есть способ вернуть курсор из PL/SQL-блока без фразы SELECT. (ну тоесть вернуть курсор в фокс из хранимой процедуры через SQLEXEC() ). ведь есть ?
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33443822
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--это понятно, что фокс и оракл разные вещи..

ладно, допустим, я напишу в селекте перечень задекларированных предварительно переменных, но я же не смогу их все вернуть одним return-ом.

наверняка есть способ вернуть курсор из PL/SQL-блока без фразы SELECT. (ну тоесть вернуть курсор в фокс из хранимой процедуры через SQLEXEC() ). ведь есть ?

как вернуть курсор я не знаю :-(
а вернуть пару параметров:

cSP = "{call Procedure(?InPutParameter1, ?InPutParameter2, ?@OutPutParameter1, ?@OutPutParameter2)}"
= SQLExec(gnConnHandle, cSP)
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33443979
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FM32YO aka KIDcSP = "{call Procedure(?InPutParameter1, ?InPutParameter2, ?@OutPutParameter1, ?@OutPutParameter2)}"
= SQLExec(gnConnHandle, cSP)
хе, вот это интересно.
а фигурные скобки - это зачем ? или они в качестве begin-а и end-а ?

а про REF CURSOR кто-нибудь что-нибудь знает ?
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33444877
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene-- FM32YO aka KIDcSP = "{call Procedure(?InPutParameter1, ?InPutParameter2, ?@OutPutParameter1, ?@OutPutParameter2)}"
= SQLExec(gnConnHandle, cSP)
хе, вот это интересно.
а фигурные скобки - это зачем ? или они в качестве begin-а и end-а ?

а про REF CURSOR кто-нибудь что-нибудь знает ?

Скобки фигурные - это так надо вызывать процедуру.. почему - я не наю. .
ибо сам так как и ты "научился" :-)
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445043
Фотография FoxLamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sqlexec может возвращать несколько наборов данных сразу...
Sqlexec(nConnect, 'процедура на сервере', 'result1','result2','result3',...)
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445126
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Eugene!

> а про REF CURSOR кто-нибудь что-нибудь знает?

А поиском слабо воспользоваться?
Да, можно вернуть ref cursor- но для этого надо знать версию Oracle и
используемый ODBC драйвер. Для Oracle 8.1.7 требуется на сервере пакет
(чтобы описать тип ref cursor-а), также возврат его в виде собственно
курсора возможен лишь через Oracle ODBC driver - MS драйвер отдыхает.
Естественно что в самой ХП это будет команда open ... for select ... а никак
не select ... into и сам курсор должен быть output параметром этой самой ХП
(при вызове он не указывается).

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445469
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FM32YO aka KIDкак вернуть курсор я не знаю :-(
вот смотри: так можно вернуть курсор из ХП
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE package mypackage
is
  type mytype is ref cursor;
  procedure myproc(result out mytype, myarg number);
end mypackage;
/

CREATE OR REPLACE package body mypackage
is
procedure myproc(result out mytype, myarg number)
is
begin
   open result for select a.* from mytable a where a.myfield = myarg;
end;
end mypackage;

а потом на клиенте (Visual Foxpro)
Код: plaintext
1.
myfoxvar = ""
=SQLEXEC(hConn, "{call mypackage.myproc(?@myfoxvar, 4)}", "mycur")
после отработки этого куска кода myfoxvar остается нетронутой, и появляется курсор mycur, содержащий нужную выборку :)
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445475
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и еще, спецы с Ораклового форума говорят, что после того, как я сделаю OPEN "REF CURSOR" FOR SELECT ... , мне нужно его еще и закрыть с помощью CLOSE "REF CURSOR". но как мне его закрыть, если для сервера он уже потерян после выхода из процедуры ? они сказали, что на форуме VFP знают, как это сделать.
вот например в мой предыдущий пост, я должен еще что-то дописывать ?
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445572
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene-- FM32YO aka KIDкак вернуть курсор я не знаю :-(
вот смотри: так можно вернуть курсор из ХП
[src oracle]CREATE OR REPLACE package mypackage
is
type mytype is ref cursor;
procedure myproc(result out mytype, myarg number);
end mypackage;
/
......


Thanks - буду знать.. хотя я как-то предпочитаю выборки делать посылом СЕЛЕКТА с клиента, а модификацию посылом команды на выполнение ХП на сервере.. ну так мне удобней и все тут...
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445589
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ибо не вижу выгоды писать ХП для выборки.
ИМХО гораздо проще написать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 cSP = "SELECT persInPut.code, persInPut.cCODEPUTEVKI, NVL(persInPut.cSurname, '  ') AS cSurname, " + ; 
	"NVL(persInPut.cNAME, '  ') AS cNAME, NVL(persInPut.cFatNAME, '  ') AS cFatNAME, " + ;
	"NVL(persInPut.cJob, '  ') AS cJob, NVL(persInPut.cPosition, '  ') AS cPosition, " + ;
	"NVL(persInPut.cIDCODE, '  ') AS cIDCODE, NVL(persInPut.cPASSPORT, '  ') AS cPASSPORT, " + ;
	"NVL(persInPut.cADRESS, '  ') AS cADRESS, persInPut.dStartDate, " + ;
	" persInPut.dEndDate, " + ;
	"putevki.n_putev, putevki.timeout, Sanatorii.code, Sanatorii.decoding_u " + ;
	" FROM FIN.FM32YO_PERSONS_IN_PUT persinput, FIN.TFV_PASS Putevki, FSF.CL_Sanat Sanatorii " + ;
	" WHERE  persInPut.cCODEPUTEVKI = putevki.code_p AND putevki.code_san = Sanatorii.code " + ;
	"AND putevki.code_san = " + THISFORM.nSanator + " AND " + ;
	"(putevki.timeout >= TO_DATE('" + THISFORM.dChosendata + "', 'dd/mm/yyyy') AND putevki.timeout <= TO_DATE('" + THISFORM.nchosenprimaryid + "', 'dd/mm/yyyy')) " + ;
	" ORDER BY putevki.n_putev"

k = SQLExec(gnConnHandle, cSP, 'PList')

IF K <>  1 
	= MESSAGEBOX('Команда ' + cSP + ' не выполнилась!!!!',  48 , 'ОБЛОМ')
ELSE


и, потом вывести на форму данные из курсора 'PList' и работать с ним....
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445797
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene-- они сказали, что на форуме VFP знают, как это сделать.
Ну раз так, то держи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
***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 вызываем эту процедуру:
Код: plaintext
1.
2.
lcSQL = "{call Get_Today_3.ReturnCursor('" ;
+ lcWarehouse + "', '" + lcCompany + "')}"
lnRetVal = SQLEXEC(nHandle, lcSQL, 'crsMyCurosr')
Как сказано выше - у Вас должен стоять на клиенте ORACLE ODBC driver.

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

Good luck!
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445853
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один пример для разнообразия:
SP in Oracle:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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 и непосредственно) собственно это тест на быстродействие
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33445887
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и, наконец, третий пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
*****************
*!*   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:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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 

Good luck!
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33447992
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Eugene!

А не надо его закрывать явно. ODBC драйвер сам всё разрулит.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33448197
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо, комрадз !

вот очередной мой идиотический вопрос:
могу ли я единовременно "запихать" на Оракл фоксовый курсор каким-либо образом, а не передавать его построчно с помощью подобного кода:
Код: plaintext
1.
2.
3.
4.
=SQLPREPARE(hConn, "insert into mytable values (?myfoxcur.myfield1, ?myfoxcur.myfield2, ...)")
SELECT myfoxcur
SCAN
  =SQLEXEC(hConn)
ENDSCAN
если мне все равно придется передать его весь построчно, было бы проще передать его сразу весь каким-то способом, если таковой существует.. программно, есессно
...
Рейтинг: 0 / 0
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
    #33456336
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Eugene!

1) XML - в виде строки всё запихать, а уж на стороне сервера "развернуть" в
ХП (пример лучше на соседнем форуме поищи/поспрашивай).
2) Гетерогенные сервисы (т.е. скинуть данные в dbf, а уж со стороны Oracle
забрать их через ODBC)
3) bulk операции (можно конечно их и програмно инициировать) - но это
насколько я помню идёт "мимо" ODBC, требует доступа к файловой системе
сервера, и для реальной работы с данными непригодно - т.е. это для
единовременных "вливаний данных" предназначено...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]