powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Глюк с updateblob. Помогите плиз.
6 сообщений из 6, страница 1 из 1
Глюк с updateblob. Помогите плиз.
    #35005893
Fangrem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В билдере есть такой код:
UPDATEBLOB CLIENTINFO
SET EXTRAINFO = :iblob_data
WHERE CLIENTINFO.COCLIENT = :il_Client;
Который исполняется верно. То есть запись в таблице апдейтится.

Далее на базе с СУБД Oracle 9i живет такой триггер.
create or replace trigger tue_clientinfo_ after update on CLIENTINFO
for each row
declare
v_userid number;
v_appid number;
v_compid number;
v_date date;
V_RET_CODE NUMBER;
v_count number;
v_extrainfo BLOB;
begin
/***/

V_RET_CODE:=GETUSERID(V_USERID,V_APPID,V_COMPID);
v_date:=sysdate;
select count(*)
into v_count
from clientinfolog
where coclient = :new.coclient;
if v_count = 0 then
-- raise_application_error(-20001,to_char(:new.extrainfo));
insert into clientinfolog values (:new.coclient,:new.extrainfo ,v_userid,v_date,to_date('25000101','YYYYMMDD'));

else
-- raise_application_error(-20001,to_char(:new.extrainfo));
update clientinfolog set uptodate = v_date where uptodate = to_date('25000101','YYYYMMDD') and coclient = :old.coclient;
insert into clientinfolog values (:new.coclient,:new.extrainfo,v_userid,v_date,to_date('25000101','YYYYMMDD'));
end if;

end;

Этот триггер ведет лог, думаю из кода понятно.

Затем в билдере выполняется такой вот селект.
SELECTBLOB EXTRAINFO
INTO :iblob_data
FROM CLIENTINFOLOG
WHERE CLIENTINFOLOG.COCLIENT = :il_Client
AND CLIENTINFOLOG.UPTODATE = :idt_date
USING SQLCA;

И этот селект падает вот с такой ошибкой:
ORA-24801 : illegal parameter value in OCI lob function
Самое интересно если в первом апдейте написать вместо

UPDATEBLOB CLIENTINFO
SET EXTRAINFO = :iblob_data
WHERE CLIENTINFO.COCLIENT = :il_Client;
следующее
ls_string = string(iblob_data)
UPDATE CLIENTINFO
SET EXTRAINFO = :ls_string
WHERE CLIENTINFO.COCLIENT = :il_Client;

То все отлично работает, и
SELECTBLOB EXTRAINFO
INTO :iblob_data
FROM CLIENTINFOLOG
WHERE CLIENTINFOLOG.COCLIENT = :il_Client
AND CLIENTINFOLOG.UPTODATE = :idt_date
прекрасно работает.

Уважаемые, помогите плиз, в чем может быть беда?
Заранее большое спасибо.
...
Рейтинг: 0 / 0
Глюк с updateblob. Помогите плиз.
    #35006540
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице поле типа CLOB или LONG?
Драйвер O90, O84 или O73?
...
Рейтинг: 0 / 0
Глюк с updateblob. Помогите плиз.
    #35008764
Fangrem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВ таблице поле типа CLOB или LONG?
Драйвер O90, O84 или O73?

В таблице clientinfolog поле extrainfo имеет тип CLOB.
Драйвер O84.
...
Рейтинг: 0 / 0
Глюк с updateblob. Помогите плиз.
    #35008889
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что в blob переменной? может там бинарные данные?
А при преобразовании в строку перед записью они обрезаются до первого спецсимвола.
...
Рейтинг: 0 / 0
Глюк с updateblob. Помогите плиз.
    #35008900
Fangrem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В iblob_data хранится текст. Во всяком случае должен. он получается следующим кодом из mle_editor
choose case ii_format_type
case ft_RTF
choose case ii_mode
case me_ReadOnly
ab_blob = ib_blob
case me_add
if ab_write_user then
rte_edit.Scroll(rte_edit.LineCount())
rte_edit.ReplaceText(ls_add_string)
end if
rte_edit.SelectTextAll()
rte_edit.Cut()

rte_view.Scroll(rte_view.LineCount())
rte_view.Paste()

ls_replace = rte_view.CopyRTF(FALSE)
ab_blob = blob(ls_replace)
ls_replace = inv_string.of_GlobalReplace(string(ab_blob),'\pard\qj}','\pard\qj')
ls_replace = ls_replace + '{\f1\fs20\cf0\up0\dn0\par}\pard\qj}'
ab_blob = ab_blob + blob(ls_replace)
case me_edit
if ab_write_user then
rte_edit.Scroll(rte_edit.LineCount())
rte_edit.ReplaceText(ls_add_string)
end if
ls_replace = rte_edit.CopyRTF(FALSE)
ab_blob = blob(ls_replace)
ls_replace = inv_string.of_GlobalReplace(string(ab_blob),'\pard\qj}','\pard\qj')
ls_replace = ls_replace + '{\f1\fs20\cf0\up0\dn0\par}\pard\qj}'
ab_blob = blob(ls_replace)
end choose
case ft_String
choose case ii_mode
case me_ReadOnly
ab_blob = ib_blob
case me_add
ab_blob = ib_blob + blob('~r~n') + blob(mle_edit.text)
if ab_write_user then ab_blob = ab_blob + blob(ls_add_string)
case me_edit
ab_blob = blob(mle_edit.text)
if ab_write_user then ab_blob = ab_blob + blob(ls_add_string)
end choose
case else
ab_blob = blob('')
this.lof_set_error(1,'Íåâåðíî çàäàí ôîðìàò')
return failure
end choose
...
Рейтинг: 0 / 0
Глюк с updateblob. Помогите плиз.
    #35009127
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Возможно при updateblob+blob данные записываются в поле в том же бинарном представлении
что и хранятся на клиенте, а при updateblob+string данные перекодируются из кодировки клиента в кодировку сервера, а при Selectblob происходит обратное преобразование независимо от типа конечной переменной.

Если это так, то в первом случае Selectblob возвратит мусор если кодировки клиента и сервера отличаются (например клиент PB10, а на сервере однобайтовая кодировка).

2) А почему не использовать string всегда (вообще исключить blob) раз работа идет с текстом?

3) Также, в 8i и 9i разная работа с лобами в OCI, так что возможно проблема в том что используется драйвер o84 с сервером или клиентом 9.
Какой клиент используете? 8, 9?
Если 9, то попробуйте сменить драйвер на o90. Если 8, то попробуйте сменить на 9 и o90.

4) Попробуйте разные билды PB
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Глюк с updateblob. Помогите плиз.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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