Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.05;
Скачать: CL | DM;

Вниз

Вопрос к знатокам 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.177 c
9-1178564278
Dovlet
2007-05-07 22:57
2009.04.05
KAk sozdat 3d cube s pomoshyu t.canvas


15-1233273959
Дмитрий Белькевич
2009-01-30 03:05
2009.04.05
Куда высылать изменения в JCL/JVCL?


2-1234344792
markers
2009-02-11 12:33
2009.04.05
Обращение к VCL объектам из потока


15-1233832544
Юрий
2009-02-05 14:15
2009.04.05
С днем рождения ! 5 февраля 2009 четверг


1-1209297887
Volk
2008-04-27 16:04
2009.04.05
помогите