Главная страница
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.017 c
15-1233560918
CodeMaster
2009-02-02 10:48
2009.04.05
Работа с PNG


15-1233414772
axis_of_evil
2009-01-31 18:12
2009.04.05
переключение сетевых настроек


2-1234938715
dolmat
2009-02-18 09:31
2009.04.05
Как добавить в строку знак


15-1233646608
keymaster
2009-02-03 10:36
2009.04.05
Вопрос к знатокам ODAC


2-1234950495
b@v
2009-02-18 12:48
2009.04.05
Excel в Access