Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Oracle SP, Refcursor, ODBC  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
Было уже.. сергей_Ч показывал примеры.. но все же.. сдаюсь...

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

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

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 ;
/


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

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


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

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

noVal1 = ''
 cJobNo = 20 
    
  nSQLResult = SQLExec(nConnHandle, "{call Invent.FM_pkg.Get_VidrFetch (?cJobNo, ?noVal1)}","MyCursor")


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

nSQLResult = SQLExec(nConnHandle, "{call Invent.FM_pkg.Get_VidrFetch (?cJobNo)}","MyCursor")

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

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


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

nSQLResult = SQLExec(nConnHandle, cSql,'MyCursor')

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

----------------------------------
Timestamp: 12:26:21.872

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

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

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

 SELECT   MyCursor
  brow

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

Что это??? То ли лыжи не едут.. то ли.... запарился уже.....
6 окт 06, 13:46    [3230204]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
ORAselect
Member

Откуда:
Сообщений: 145
 SELECT   MyCursor
  brow

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

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

а просто brows, если следующей строкой после исполнения ХП его поставить что показывает?
6 окт 06, 13:53    [3230257]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
ORAselect

а просто brows, если следующей строкой после исполнения ХП его поставить что показывает?


та же самая ошибка 13
6 окт 06, 13:57    [3230288]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
tru55
Member

Откуда: СПб
Сообщений: 19791
А можно вопросик, не относящийся к FoxPro?

Что ты хочешь получить из этой процедуры?
Ты что, надеешься, что она будет выводить текст на экран, так же, как в sql*plus?
6 окт 06, 16:15    [3231313]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
4 дня назад, сам не знаю как, но мне удалось вернуть курсор на фокса...
но что-то я потом сдалал.. и.. уже но получается...

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


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

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?


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

вот, что я хочу реализовать к примеру
6 окт 06, 16:42    [3231481]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
tru55
Member

Откуда: СПб
Сообщений: 19791
на всякий случай :)
https://www.sql.ru/forum/actualthread.aspx?tid=346516#3224960
6 окт 06, 16:47    [3231500]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
FM32YO......
Guest
tru55
А можно вопросик, не относящийся к FoxPro?

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


LOOP
	FETCH Vidr_cur INTO cPers  ;
	EXIT WHEN Vidr_cur%NOTFOUND ;
	END LOOP;
  DBMS_OUTPUT.put_line('ФИО  '|| cPers);

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

В этом помощи хочууууу
6 окт 06, 16:54    [3231546]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
tru55
на всякий случай :)
https://www.sql.ru/forum/actualthread.aspx?tid=346516#3224960


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

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

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 ;
6 окт 06, 17:00    [3231603]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
FM32YO aka KID
Member

Откуда: Ukraine
Сообщений: 884
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, который есть создатель/владелец пакета:

nWhereTo = 20
 noVal1 = ' '
 
 nSQLResult = SQLEXEC(nConnHandle,"{call invent.my_pkg.open_my_cur(?nWhereTo, ?noVal1)}","fmc")
    
  SELECT fmc
  brow

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

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

 ----------------------------------  
  Timestamp: 12:02:19.172  
  BEGIN invent.my_pkg.open_my_cur(:1 , :2 ); END;  
  :1 = 20

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

GRANT execute on my_pkg to user02;

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

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%-й уверенности, что процедура отработала и вернула мне набор значений - делаем еще одну проверку:

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

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

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

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

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

----------------------------------  
  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 = '', передался в процедуру как ''

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


Может кто-нибудь подсказать - в чем же грабли-то?????
9 окт 06, 09:06    [3235274]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
FM32Yo......
Guest
up
9 окт 06, 12:35    [3236480]     Ответить | Цитировать Сообщить модератору
 Re: Oracle SP, Refcursor, ODBC  [new]
fm32yo....
Guest
up again
10 окт 06, 09:31    [3239753]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить