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

Код: 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
19.12.2005, 10:06
    #33443461
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
А что, разве так не работает:
Код: plaintext
1.
2.
3.
SQLString = ;
    "select * from mytable; "
=SQLEXEC(hConn, SQLString, "MyCursor")
...
Рейтинг: 0 / 0
19.12.2005, 10:17
    #33443480
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
прошу прощения за неразбериху, я хтел сказать, что:
Код: 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
19.12.2005, 11:01
    #33443560
FM32YO aka KID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
--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
19.12.2005, 11:13
    #33443585
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
это понятно, что фокс и оракл разные вещи..

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

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

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

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

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

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

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

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

Скобки фигурные - это так надо вызывать процедуру.. почему - я не наю. .
ибо сам так как и ты "научился" :-)
...
Рейтинг: 0 / 0
19.12.2005, 18:32
    #33445043
FoxLamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
Sqlexec может возвращать несколько наборов данных сразу...
Sqlexec(nConnect, 'процедура на сервере', 'result1','result2','result3',...)
...
Рейтинг: 0 / 0
19.12.2005, 19:23
    #33445126
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
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
20.12.2005, 06:49
    #33445469
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
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
20.12.2005, 07:03
    #33445475
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
и еще, спецы с Ораклового форума говорят, что после того, как я сделаю OPEN "REF CURSOR" FOR SELECT ... , мне нужно его еще и закрыть с помощью CLOSE "REF CURSOR". но как мне его закрыть, если для сервера он уже потерян после выхода из процедуры ? они сказали, что на форуме VFP знают, как это сделать.
вот например в мой предыдущий пост, я должен еще что-то дописывать ?
...
Рейтинг: 0 / 0
20.12.2005, 09:07
    #33445572
FM32YO aka KID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
--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
20.12.2005, 09:13
    #33445589
FM32YO aka KID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
Ибо не вижу выгоды писать ХП для выборки.
ИМХО гораздо проще написать
Код: 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
20.12.2005, 10:28
    #33445797
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
--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
20.12.2005, 10:44
    #33445853
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
Еще один пример для разнообразия:
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
20.12.2005, 10:52
    #33445887
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
Ну и, наконец, третий пример:
Код: 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
21.12.2005, 02:41
    #33447992
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разве Oracl-овая stored procedure не может вернуть курсор через SQLEXEC() ?
Hi Eugene!

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

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

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

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

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


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