Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / FoxPro, Visual FoxPro |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
ORAselect Member Откуда: Сообщений: 145 |
SELECT MyCursor brow получаю ERROR N13 Псевдоним MyCursor не найден.... Что это??? То ли лыжи не едут.. то ли.... запарился уже.....[/quot] а просто brows, если следующей строкой после исполнения ХП его поставить что показывает? |
6 окт 06, 13:53 [3230257] Ответить | Цитировать Сообщить модератору |
FM32YO aka KID Member Откуда: Ukraine Сообщений: 884 |
та же самая ошибка 13 |
||
6 окт 06, 13:57 [3230288] Ответить | Цитировать Сообщить модератору |
tru55 Member Откуда: СПб Сообщений: 19791 |
А можно вопросик, не относящийся к FoxPro? Что ты хочешь получить из этой процедуры? Ты что, надеешься, что она будет выводить текст на экран, так же, как в sql*plus? |
6 окт 06, 16:15 [3231313] Ответить | Цитировать Сообщить модератору |
FM32YO aka KID Member Откуда: Ukraine Сообщений: 884 |
4 дня назад, сам не знаю как, но мне удалось вернуть курсор на фокса... но что-то я потом сдалал.. и.. уже но получается...
Нет!!! получался, и должен получиться в фоксе курсор (временная таблица) с такой вот выборкой: 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 ; Мне нужно не посылать с клиента напрямую сей запрос на сервер, чтобы получить эту выборку (прямой селект - получается и это не сложно...) Я хочу сделать это через процедуру... знаю, что это возможно но.. вот и грабли....
типа наехали??? ![]() ![]() ![]() Да ну тебя :)) ![]() ![]() вот, что я хочу реализовать к примеру |
||||
6 окт 06, 16:42 [3231481] Ответить | Цитировать Сообщить модератору |
tru55 Member Откуда: СПб Сообщений: 19791 |
на всякий случай :) https://www.sql.ru/forum/actualthread.aspx?tid=346516#3224960 |
6 окт 06, 16:47 [3231500] Ответить | Цитировать Сообщить модератору |
FM32YO......
Guest |
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] Ответить | Цитировать Сообщить модератору |
FM32YO aka KID Member Откуда: Ukraine Сообщений: 884 |
да, я выше пояснил.. зачем вставил в процедуру 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
FM32Yo......
Guest |
up |
9 окт 06, 12:35 [3236480] Ответить | Цитировать Сообщить модератору |
fm32yo....
Guest |
up again |
10 окт 06, 09:31 [3239753] Ответить | Цитировать Сообщить модератору |
Все форумы / FoxPro, Visual FoxPro | ![]() |