powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Oracle SP, Refcursor, ODBC
11 сообщений из 11, страница 1 из 1
Oracle SP, Refcursor, ODBC
    #34037575
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Было уже.. сергей_Ч показывал примеры.. но все же.. сдаюсь...

Коннект к Ораклу идет через Oracle ODBC Driver

На сервере есть процедура:

Код: 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.
CREATE OR REPLACE PACKAGE FM_pkg AS
      TYPE RefCursor IS REF CURSOR ;
     PROCEDURE Get_VidrFetch
	  (
	  choice IN VIDR.id%TYPE,
	  Vidr_cur OUT RefCursor
	  );
   END ;
/

CREATE OR REPLACE PACKAGE BODY FM_pkg AS
       PROCEDURE Get_VidrFetch
	  (
	  choice IN VIDR.id%TYPE,
	  Vidr_cur OUT RefCursor
	  )
	   IS
	    cPers VARCHAR2( 100 );
       BEGIN
	   DBMS_OUTPUT.Enable( 100000 );
       OPEN Vidr_cur FOR
	SELECT c.fio ||' '|| c.name ||' '|| c.otch AS Pers
	   FROM VIDR a, RVD b, fxb.TFV_Karta c
	   WHERE a.WHERETO = b.id
	   AND a.person = c.tn  AND a.WHERETO = choice;
	LOOP
	FETCH Vidr_cur INTO cPers  ;
	EXIT WHEN Vidr_cur%NOTFOUND ;
	END LOOP;
  DBMS_OUTPUT.put_line('ФИО  '|| cPers);

-----	   close Vidr_cur;
     END ;
   END ;
/


Вызываю ее из СКЛ+

Код: plaintext
1.
2.
3.
4.
5.
declare
somecur invent.fm_pkg.RefCursor ;
code integer := 17 ;
 begin
  invent.fm_pkg.Get_VidrFetch (code, somecur);
 end;


получаю:
Код: plaintext
ФИО Иванов Петр Васильевич
то есть ХП раболтает и дает мне то, что надо!!!!

Вызываю ее из ВФП 7

Код: plaintext
1.
2.
3.
noVal1 = ''
 cJobNo =  20  
    
  nSQLResult = SQLExec(nConnHandle, "{call Invent.FM_pkg.Get_VidrFetch (?cJobNo, ?noVal1)}","MyCursor")


Получаю "неверное количество или тип аргументов функции Get_VidrFetch"
Ну да хрен с ним.. видимо переменную типа Рефкурсор надо хитко как-то объявлять??
Хотя нашел совет, что в таком случае ее можно просто опустить... т.е. не указывать:

Код: plaintext
nSQLResult = SQLExec(nConnHandle, "{call Invent.FM_pkg.Get_VidrFetch (?cJobNo)}","MyCursor")

не помогло.. та же ошибка....
Фиг с ней.. идем другим путем, совсем уж прямолинейным:

Код: plaintext
1.
2.
cSql = 'declare somecur invent.fm_pkg.RefCursor ; code integer :=17; begin invent.fm_pkg.Get_VidrFetch (code, somecur); end;'
 
 WAIT WINDOW cSql


посмотрели какая строка сформировалась

Код: plaintext
nSQLResult = SQLExec(nConnHandle, cSql,'MyCursor')

при помощи SQL-monitor параллельно отслеживаю, что же послано было на сервер... вижу:

Код: plaintext
1.
2.
3.
4.
5.
6.
----------------------------------
Timestamp:  12 : 26 : 21 . 872 

declare somecur invent.fm_pkg.RefCursor ; code integer := 17 ; begin
invent.fm_pkg.Get_VidrFetch (code, somecur); end;

----------------------------------

УРА ХП ж выполнилась!!!!!
добавляю:

Код: plaintext
1.
 SELECT   MyCursor
  brow

получаю
Код: plaintext
1.
ERROR N13
Псевдоним MyCursor не найден....

Что это??? То ли лыжи не едут.. то ли.... запарился уже.....
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34037619
ORAselect
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
 SELECT   MyCursor
  brow

получаю
Код: plaintext
1.
ERROR N13
Псевдоним MyCursor не найден....

Что это??? То ли лыжи не едут.. то ли.... запарился уже.....[/quot]

а просто brows, если следующей строкой после исполнения ХП его поставить что показывает?
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34037639
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORAselect
а просто brows, если следующей строкой после исполнения ХП его поставить что показывает?

та же самая ошибка 13
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34038314
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно вопросик, не относящийся к FoxPro?

Что ты хочешь получить из этой процедуры?
Ты что, надеешься, что она будет выводить текст на экран, так же, как в sql*plus?
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34038437
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4 дня назад, сам не знаю как, но мне удалось вернуть курсор на фокса...
но что-то я потом сдалал.. и.. уже но получается...

tru55Что ты хочешь получить из этой процедуры?


Нет!!! получался, и должен получиться в фоксе курсор (временная таблица)
с такой вот выборкой:

Код: plaintext
1.
2.
3.
SELECT c.fio ||' '|| c.name ||' '|| c.otch AS Pers
	   FROM VIDR a, RVD b, fxb.TFV_Karta c
	   WHERE a.WHERETO = b.id
	   AND a.person = c.tn  AND a.WHERETO =  17  ;

Мне нужно не посылать с клиента напрямую сей запрос на сервер, чтобы получить эту выборку (прямой селект - получается и это не сложно...)

Я хочу сделать это через процедуру... знаю, что это возможно но.. вот и грабли....

авторТы что, надеешься, что она будет выводить текст на экран, так же, как в sql*plus?

типа наехали???
Да ну тебя :))

вот, что я хочу реализовать к примеру
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34038450
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34038481
FM32YO......
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tru55А можно вопросик, не относящийся к FoxPro?

Что ты хочешь получить из этой процедуры?
Ты что, надеешься, что она будет выводить текст на экран, так же, как в sql*plus?

Код: plaintext
1.
2.
3.
4.
LOOP
	FETCH Vidr_cur INTO cPers  ;
	EXIT WHEN Vidr_cur%NOTFOUND ;
	END LOOP;
  DBMS_OUTPUT.put_line('ФИО  '|| cPers);

в
Код: plaintext
PROCEDURE Get_VidrFetch
я ввел намеренно (изначально она не фетчила), ввел я это, ибо грешным делом подумал, что проца и в оракле ни хрена мне не возвращает...
В том-то и загвоздка (или мое торможение), что в СКЛ+ данные есть, а то же самое через ОДБС - данных нету....

В этом помощи хочууууу
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34038524
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tru55на всякий случай :)
http://www.sql.ru/forum/actualthread.aspx?tid=346516#3224960

да, я выше пояснил.. зачем вставил в процедуру DBMS_OUTPUT.put_line...
Не нашел иного варианта как проверить дает ли она что-нибудь в самом оракле...

была попытка так же вызывать другую процу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
PROCEDURE Get_VidrFetch
	  (
	  choice IN VIDR.id%TYPE,
	  Vidr_cur OUT RefCursor
	  )
	   IS
	    cPers VARCHAR2( 100 );
       BEGIN
	   DBMS_OUTPUT.Enable( 100000 );
       OPEN Vidr_cur FOR
	SELECT c.fio ||' '|| c.name ||' '|| c.otch AS Pers
	   FROM VIDR a, RVD b, fxb.TFV_Karta c
	   WHERE a.WHERETO = b.id
	   AND a.person = c.tn  AND a.WHERETO = choice;
     END ;
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34040638
Фотография FM32YO aka KID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CONNECT invent/**** ;

CREATE OR REPLACE PACKAGE my_pkg AS
      TYPE curTyp IS REF CURSOR;
      PROCEDURE open_my_cur
	  (
	  choice IN INTEGER,
	  my_cur OUT curTyp
      );
   END ;
/

CREATE OR REPLACE PACKAGE BODY my_pkg AS
     PROCEDURE open_my_cur (choice IN INTEGER, my_cur OUT curTyp
                             ) IS
       BEGIN
       OPEN my_cur FOR
	   SELECT a.OutDATE, a.BackDATE, c.fio ||' '|| c.name ||' '|| c.otch AS Pers, a.AIM, a.REPORT, b.CODE, b.NAME
	   FROM VIDR a, RVD b, fxb.TFV_Karta c
	   WHERE a.WHERETO = b.id
	   AND a.person = c.tn  AND a.WHERETO >= choice;
     END open_my_cur;
   END my_pkg;
/

Пакет создан

Вызываем его из ВФП под пользователем invent, который есть создатель/владелец пакета:

Код: plaintext
1.
2.
3.
4.
5.
6.
nWhereTo =  20 
 noVal1 = ' '
 
 nSQLResult = SQLEXEC(nConnHandle,"{call invent.my_pkg.open_my_cur(?nWhereTo, ?noVal1)}","fmc")
    
  SELECT fmc
  brow

Получили нужный набор данных (курсор с несколькими записями)

Результат трассировки (в SQL-Monitor):

Код: plaintext
1.
2.
3.
 ----------------------------------  
  Timestamp:  12 : 02 : 19 . 172   
  BEGIN invent.my_pkg.open_my_cur(: 1  , : 2  ); END;  
  : 1  =  20 

Передадим право на выполнение пакета другому пользователю:

Код: plaintext
GRANT execute on my_pkg to user02;

проверим, вызывается/выполняется ли пакет под пользователем user02:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CONNECT user02/**** ;

declare
cCursor invent.my_pkg.curTyp ;
nGo INTEGER := 10 ;

begin

invent.my_pkg.open_my_cur (nGo, cCursor);

end;
/

PL/SQL procedure successfully completed

== Работает!!!!

Для 100%-й уверенности, что процедура отработала и вернула мне набор значений - делаем еще одну проверку:

Код: 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.
CONNECT user02/**** ;

declare
cCursor invent.my_pkg.curTyp ;
nGo INTEGER := 10 ;
cpers VARCHAR2( 50 );
d1 DATE;
d2 DATE;
caim VARCHAR2( 200 );
cRep VARCHAR2( 1000 );
cCode VARCHAR2( 10 );
cNm VARCHAR2( 50 );

begin

invent.my_pkg.open_my_cur (nGo, cCursor);

LOOP
FETCH cCursor  INTO d1, d2, cpers,  caim, cRep, cCode, cNm  ;
EXIT WHEN cCursor%NOTFOUND ;
DBMS_OUTPUT.put_line(': ' || cpers || ' - ' || cCode || ' - '|| cNm);
END LOOP;
end;
/

PL/SQL procedure successfully completed

Результат налицо:
Код: plaintext
1.
: Иванов Петр Васильевич -  2222  - Директор
: Безымянная валентина Николаевна -  21006  - Главный бухгалтер

Курсор с такими же данными я получил в ВФП-шное клиентское приложение, когда запускал через ОДБС данный пакет (только под коннектом владельца пакета)

Теперь запувкаю тот же пакет под пользователем user02, точно так же:

Код: plaintext
1.
2.
3.
4.
5.
6.
nWhereTo =  20 
 noVal1 = ' '
 
 nSQLResult = SQLEXEC(nConnHandle,"{call invent.my_pkg.open_my_cur(?nWhereTo, ?noVal1)}","fmc")
    
  SELECT fmc
  brow
И.. опять 13
Курсор fmc не сформировался... трассировка показала:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
----------------------------------  
  Timestamp:  12 : 13 : 47 . 223   
    
  BEGIN invent.my_pkg.open_my_cur(: 1  , : 2  ); END;  
    
  : 1  =  20   
  : 2  = ''  
  Oracle error occurred:  6550  (ORA- 06550 : 
  PLS- 00306 : неверное количество или тип аргументов  'OPEN_MY_CUR'  
  PL/SQL: Statement ignored)  
  ----------------------------------

то есть.. каким-то непостижимым образом мой паарметр
noVal1 = '', передался в процедуру как ''

И, ИМХО именно из-за такой "пляски" в передаче параметра пакет не выполняется под другим пользователем (отличным от владельца пакета)


Может кто-нибудь подсказать - в чем же грабли-то?????
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34041290
FM32Yo......
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
Oracle SP, Refcursor, ODBC
    #34043249
fm32yo....
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up again
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Oracle SP, Refcursor, ODBC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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