Форум: "Прочее";
Текущий архив: 2009.04.05;
Скачать: [xml.tar.bz2];
ВнизВопрос к знатокам ODAC Найти похожие ветки
← →
keymaster © (2009-02-03 10:36) [0]Приложение на Delphi 2006 работает с базой под Oracle 10g.
Вся работа ведётся через хранимки, объединённые в пакеты.
Хранимки написаны следующим образом:function myprocedure(someparams) return nvarchar2 is
begin
......
commit;
return null;
exception
when others then
rollback;
return sqlerrm;
end;
т.е. при успешном выполнении результат пустой, при ошибке - в результате строка ошибки, которую "видит" приложение и показывает пользователю error message.
Запускается всё это через OraStoredProc. B И всё хорошо до тех пор, пока эта функция "главная" в компоненте. Она честно записывает результат в параметр "Result".
Но в силу ряда причин приложение переписано и теперь на orastoredproc висит всё: чтение списка данных, insert, update, lock, заполнены соответсвующие sql-запросы, т.е., к примеру, insertsql=":result := mypackage.myfunction(params)".
И тут всё рассыпается, т.к. она пытается писать result не в параметр который доступен через свойства компонента, а в какое-то своё поле, о чём и сообщает - что нужно такое поле.
Создавал calculated-поле result и подсовывал его, но оно во всех случаях остаётся пустым.
Как выкрутиться?
← →
Медвежонок Пятачок © (2009-02-03 10:44) [1]переписать приложение еще раз
← →
Медвежонок Пятачок © (2009-02-03 10:46) [2]и теперь на orastoredproc висит всё: чтение списка данных, insert, update, lock, заполнены соответсвующие sql-запросы, т.е., к примеру, insertsql=":result := mypackage.myfunction(params)".
а не должно теперь все висеть на orastoredproc.
должно "висеть" на orasql в котором оформляется анонимный блок.
← →
keymaster © (2009-02-03 11:01) [3]Без разницы.
OraQuery так же возвращает ошибкуnot found field correspondiong parameter result.
← →
Медвежонок Пятачок © (2009-02-03 11:02) [4]ну так ошибка в синтаксике.
← →
keymaster © (2009-02-03 11:04) [5]
> ну так ошибка в синтаксике.
где именно?
← →
Медвежонок Пятачок © (2009-02-03 11:06) [6]мне угадать номер строки и колонки?
← →
Медвежонок Пятачок © (2009-02-03 11:07) [7]... не видя вообще что там у тебя сейчас понаписано
← →
keymaster © (2009-02-03 11:09) [8]
create table TST
(
TST_ID NUMBER not null,
TST_NAME NVARCHAR2(100) not null
);
> create sequence SQ_TST
> minvalue 0
> maxvalue 999
> start with 21
> increment by 1
> cache 20;
в пакете:
> function listtst(P_TST OUT ref_cur) return nvarchar2 is
> begin
> open P_TST for
> select * from tst;
> return null;
> end;
>
> function instst(P_NAME tst.tst_name%TYPE) return nvarchar2
> is
> begin
> insert into tst(tst_id,tst_name)
> values(sq_tst.nextval, P_NAME);
> commit;
> return null;
> exception
> when others then
> rollback;
> return sqlerrm;
> end;
В компоненте (OraQuery):
SQL =begin
:RESULT := TSTPACK.INSTST(:P_NAME);
end;
InsertSQL =begin
:RESULT := TSTPACK.INSTST(:P_NAME);
end;
← →
Медвежонок Пятачок © (2009-02-03 11:24) [9]и какой же это инсерт скл?
и как он по твоему должен догадаться к какому полю вязать параметр резалт?
← →
keymaster © (2009-02-03 11:26) [10]об этом я говорил в своём первом сообщении.
у компонента oraquery (или orastoredproc) есть параметр RESULT, но оно требует поле.
← →
Медвежонок Пятачок © (2009-02-03 11:38) [11]у тебя неправильный insert sql вот и все.
да еще и в точности совпадающий с select sql.
в общем полная бессмыслица
← →
keymaster © (2009-02-03 11:41) [12]Блин. закопипастил одно и то же два раза.
SQL=begin
:RESULT := hbase.TSTPACK.LISTTST(:P_TST);
end;
P_TST - это out-параметр типа cursor
← →
keymaster © (2009-02-03 11:43) [13]Указанный InsertSQL прекрасно работает, если он записан в orastoredproc в качестве SQL - в таком случае функция выполняется и в параметр компонента записывается результат.
← →
Медвежонок Пятачок © (2009-02-03 11:44) [14]интересно, каким образом обращение к такому listtst в тексте insert sql поможет что-то вставить на сервере?
function listtst(P_TST OUT ref_cur) return nvarchar2 is
> begin
> open P_TST for
> select * from tst;
> return null;
> end;
← →
keymaster © (2009-02-03 11:46) [15]
> интересно, каким образом обращение к такому listtst в тексте
> insert sql поможет что-то вставить на сервере?function listtst(P_TST
> OUT ref_cur) return nvarchar2 is> begin> open P_TST
> for> select * from tst;> return null; > end;
это НЕ INSERTSQL. Это SELECT SQL, о чём, в общем-то нетрудно догадаться.
← →
Медвежонок Пятачок © (2009-02-03 11:47) [16]а пару минут тому это было инсерт-скл"ем
← →
keymaster © (2009-02-03 11:48) [17]
> а пару минут тому это было инсерт-скл"ем
не было ни разу.
стоит перечитать топик - это будет понятно.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.04.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c