powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
14 сообщений из 14, страница 1 из 1
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33349256
ice_79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СУБД Oracle 8i
PB 10.0 - evaluation, только что скачал.

1. Есть хранимая процедура:
procedure tmp_test_proc(
parm1 OUT integer,
parm2 OUT varchar2,
parm3 OUT integer,
parm4 OUT varchar2,
parm5 OUT integer
) is
BEGIN
parm1 :=55;
parm2 :='5';
parm3 :=541;
parm4 :='Text';
parm5 :=5415;
END;

2. Вызываю ее из PB:
DECLARE tmp_proc PROCEDURE FOR
tmp_test_proc()
USING sqlca;

EXECUTE tmp_proc;
if sqlca.sqlcode<>0 then
MessageBox('Error',sqlca.sqlerrtext,StopSign!)
return
end if

string s1,s2,s3,s4,s5
FETCH tmp_proc INTO :s1,:s2,:s3,:s4,:s5;
if sqlca.sqlcode <> 0 then
MessageBox('Error',sqlca.sqlerrtext,StopSign!)
CLOSE tmp_proc;
return
end if

CLOSE tmp_proc;

Ошибок при выполнении нет.
В результате имею:
s1='5' parm1 :=55;
s2='5' parm2 :='5';
s3='54' parm3 :=541;
s4='Text' parm4 :='Text';
s5='541' parm5 :=5415;

Что я сделал не так? Или где копать?
В integer-переменные считывать пробовал - то же самое (54 вместо 541).
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33349341
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ice_79 wrote:

> СУБД Oracle 8i
> PB 10.0 - evaluation, только что скачал.

Патчи ставить пробовал? Я с десяткой не работаю, но вроде бы 10.2
давненько вышел...
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33349370
ice_79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dim2000
Патчи ставить пробовал? Я с десяткой не работаю, но вроде бы 10.2
давненько вышел...

Как раз сейчас качаю.
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33350334
ice_79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Патч установил, ничего не изменилось.
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33350579
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не претендуя на истину в последней инстанции, могу сказать следующее.
Чтобы фетчить резульсэт надо из процедуры возвращать ref cursor. А чтобы было как у вас, надо через пользовательский SQLCA.
HTML Books - using Oracle stored procedures
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33350594
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Using Transaction objects to call stored procedures - HTML Books
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33350678
ice_79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я, блин, и так через RPC (external function) пробовал, получилось совсем смешно: integer-ы вернулись нормально, а у varchar-ов отрубился последний символ. (Все это напоминает особо извращенное издевательство).

Через Declare тоже можно получать OUT параметры, даже если не возвращается ссылка на курсор, в 6.5 все отлично работает.

//local external для объекта транзакции
PUBLIC SUBROUTINE test_proc (ref integer p1, ref string p2, ref integer p3, ref string p4, ref integer p5) RPCFUNC ALIAS FOR "TMP_TEST_PROC"

//Вызов
integer i1,i3,i5
s2=fill(' ',2000)
s4=fill(' ',2000)
sqlca.test_proc(i1,s2,i3,s4,i5)

//Результат
sqlca.sqlcode=0
i1=55 //parm1 :=55;
s2='' //parm2 :='5';
i3=541 //parm3 :=541;
s4='Tex' //parm4 :='Text';
i5=5415 //parm5 :=5415;
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33350712
zolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у пары Oracle-Powerbuilder конструкция OUT INTEGER всегда была с "легким сдвигом". Наиболее стабильная использовать OUT ref cusor.
но можно пробовать OUT NUMBER(приведенный к SQL тип данных), возможно 10-й Powerbuilder "научился" читать определение процедуры у Oracle, в предыдущих версиях вся проверка производилась методом "попытки" выполнения процедуры во время компиляции.
INTEGER у Oracle это PL/SQL тип NUMBER(38,0), и здесь судя по всему и очередная не стыковка

или в заданном вопросе проще все сделать OUT VARCHAR2 :), но с национильными настройками сервер-клиент при передаче после десятичной точки придется подолбаться
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33350741
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ice_79СУБД Oracle 8i
PB 10.0 - evaluation, только что скачал.

1. Есть хранимая процедура:

Для начала, IMHO, устраните проблему на стороне сервера
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure tmp_test_proc(
    parm1 OUT integer,
    parm2 OUT varchar2,
    parm3 OUT integer,
    parm4 OUT varchar2,
    parm5 OUT integer
) is
BEGIN
    parm1 := 55 ;
    parm2 :='5' || ' ';
    parm3 := 541  || ' ';
    parm4 :='Text' || ' ';
    parm5 := 5415 ;
END;
автор
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//local external для объекта транзакции
PUBLIC SUBROUTINE test_proc (ref integer p1, ref string p2, ref integer p3, &
ref string p4, ref integer p5) RPCFUNC ALIAS FOR "TMP_TEST_PROC"

//Вызов
integer i1,i3,i5
s2=fill(' ', 2000 )
s4=fill(' ', 2000 )
sqlca.test_proc(i1,s2,i3,s4,i5)


А если нужно устранить причину - тогда открывается широчайшее поле деятельности по установке EBF, патчей Oracle и т.п. :-)
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33352360
ice_79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проект большой, серверная часть большая и вызовов процедур с OUT-параметрами слишком много, чтобы было можно пользоваться "заплаточными" методами. Требуется как раз устранить причину.
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33352601
zolg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
причина не в Oracle гарантировано, и с этой стороны можете "не латать",
иначе бы не работали все третьесторонние проекты работающие с этой СУБД.

причина в другом - integer в Oracle совсем не integer в PowerBuilder,
у Oracle PL/SQL, в отличии от ASA и MS SQL, все числовые типы данных это различные вариации(subtype) от NUMBER , см. SYS.Standart.
и ваш вариант,

string s1,s2,s3,s4,s5
FETCH tmp_proc INTO :s1,:s2,:s3,:s4,:s5;

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

для начала попробуйте s1,s3,s5 объявить другим типом - long,decimal,double,
только не integer, и тем более не string, это Oracle умеет сам конвертировать тип данных.
примерно такой же "капризный" вариант данными типа DATA.

и вариант Oracle 8i - PB 10.0 - полностью рабочий вариант ,
без никаких патчей, только подумать надо немного.

П.С.
по поводу reference переменных: procedure tst(a_vstr ref varchar2) -
со строны PB при вызове надо сразу "зарезирвировать" (fill(' ',2000))столько места, сколько может вернуть процедура...., далеко не всегда максимум , который может вернуться через varchar2.
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33352683
ice_79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) Я пробовал и double, и decimal, и long - результат не изменился.
2) При объявлении как RPC пробовал присваивать в переменную перед вызовом ровно столько символов, сколько должно вернуться - ничего не меняется.

Попробую PB 10.0 установить на другой машине под WinXP (у меня Win2000 SP4).
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33353867
ice_79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В XP (SP2) все заработало сразу.
Видимо на моей машине криво установлена ОС.
Cпасибо всем за участие.
...
Рейтинг: 0 / 0
Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
    #33357985
ice_79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Причина глюка выяснена окончательно - Oracle Client 8.1.7.0
После установки 8.1.7.4 - все работает в том числе и на Win 2000 SP4.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Глюк при Fetch-е OUT-переменных хранимой процедуры в 10.0
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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