Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как выполнить хранимую процедуру Oracle8 ?


lightix ©   (2003-04-03 09:28:00) 

Народ, подскажите как выполнить хранимую процедуру Oracle из своей программы? Использую NCOCI8 для подключния к ORacle. В нем есть компонента TNCOCIStoredProcedure, но и сней ничего не выходит :(
Если расскажете как выполнить хранимую функцию и получить ее значение , то это еще лучше :)
Заранее спасибо.


lightix   (2003-04-03 11:29:00) [1]

Все работает, спасибо!
я просто намудрил с типами параметров - у меня в базе TABN NUMBER(10) , а для параметра указал тип (внутренний) Integer и тип для базы Integer(10) - вот оно и ругнулось что не может преобразовать Integer в Integer (10) :))
Поставил тип String - и все получилось :)

Огромное Вам спасибо, Наталия.


Наталия   (2003-04-03 11:17:00) [2]

Это уже ошибка Oracle - где-то в самой процедуре ищи.
Ты правильно понял. Вот сделала тестовый примерчик, у меня работат без проблем:
PROCEDURE P0 (n IN varchar2,id_user out varchar2)
IS
uz varchar2(2);
BEGIN
uz:=n;
id_user:="ggg";

END; -- Procedure
--------------------------
OCIStoredProc1.ExecProc;
showmessage(OCIStoredProc1.Params[1].asstring);
Всё работает.
Попытайся сначала явно задать параметры в свойстве Params.


lightix   (2003-04-03 10:52:00) [3]

делаю вот так:
StoredProc1->Params->ParamByName("DIAP")->AsInteger=0;
StoredProc1->Params->ParamByName("CEX")->AsInteger=0;
StoredProc1->ExecProc();
ShowMessage(StoredProc1->Params->ParamByName("NEW_TABN")->AsInteger);
Вылетает сообщение
ORA-01460: запрошено бессмысленное или недопустимое преобразование данных


lightix   (2003-04-03 10:35:00) [4]

а, дошло.... надо
procedure get_free_tabn (diap in number,cex in number,free_tabn out number).


lightix   (2003-04-03 10:31:00) [5]

Т.е написать вот так:
procedure get_free_tabn (diap in number,cex in number)
return number
as
...........
...........
return free_tabn;
end;
????
А где их нужно определять, эти входные параметры? я так понимаю , мне и выходной параметр нужен тоже?


Наталия   (2003-04-03 10:27:00) [6]

При чём здесь функция? В заголовке процедуры опиши выходной параметр.
А входные параметры когда ты в StoredProc определяешь?


lightix   (2003-04-03 10:22:00) [7]

Все это указывал. Безрезультатно.
процедуру оформлял как функцию:
function get_free_tabn (diap in number,cex in number)
return number
as
...................
...................
return free_tabn;
end;

В свойствах TOCIStoredProc указываю
DatabaseName = Default
После этого дает мне выбрать из списка StoredProcName, Выбираю GET_FREE_TABN, при попытке сделать Active=true сразу вылетает ошибка:
OCIStoredProc1: NOE127/Q - Нельзя вызвать метод Open для объявления без RowSet.


Наталия   (2003-04-03 10:02:00) [8]

1) В параметрах процедуры опиши выходной параметр
2) В свойствах процедуры указывай DataBaseName и StoredProcName.
Если процедура не в пакете, то проссто указывается её имя.


lightix   (2003-04-03 09:48:00) [9]

TOCIStoredProcedure не работает, потому что помимо имени процедуры требует еще и PACKAGE NAME, а я процедуру то просто создал, не закидывая ни в какой из пакетов :(
А если его не указывать, то при попытке выполнения вылетает ошибка "процедура DEFAULT.GET_FREE_TABN" не найдена :((
из SQL PLUS через EXECUTE запускается запросто...Именно из программы не получается ....


lightix   (2003-04-03 09:41:00) [10]

procedure get_free_tabn (diap in number,cex in number)
as
kt_max_tabn number; -- Максимальный таб.номер
kt_count_tabn number; -- Количество записей в КТ

free_tabn number:=0; -- Возвращаемое значение

min_tabn number; -- Минимальное значение из диапазона
max_tabn number; -- Максимальное значение из диапазона

m_tabn number;
m_npp number;
begin

if diap = 0 then
If cex=8 or cex=40 or cex=39 then
min_tabn:=440000;
max_tabn:=449999;
else
min_tabn:=1;
max_tabn:=699999;
end if;
elsif diap = 7 or diap = 8 or diap = 9 then
min_tabn:=diap*100000+cex*1000+1;
max_tabn:=min_tabn+998;
end if;

commit;
-- блокируем таблицу
lock table kt in exclusive mode;
-- Выбираем максимальный табеьный N из KT, количество записей
select nvl(max(tabn),0),count(tabn) into kt_max_tabn,kt_count_tabn from kt where nvl(tabn,0)!=0 and tabn>=min_tabn and tabn<=max_tabn;

if kt_max_tabn-min_tabn-1-kt_count_tabn>0 and kt_max_tabn>0 then
-- Если есть "дырки" в диапазоне
--//////////////////////////////////

insert into tmp_tabn (select tabn,rownum+min_tabn-1 from kt where nvl(tabn,0)!=0 and tabn>=min_tabn and tabn<=max_tabn);
select min(tabn) into m_tabn from tmp_tabn where tabn!=npp;
select npp into m_npp from tmp_tabn where tabn=m_tabn;

free_tabn:=m_npp;

-- ////////////////////////////////
else
--Если "дырок" нет
if kt_max_tabn<max_tabn or kt_max_tabn = 0 then
--Если есть еще место в диапазоне
if kt_max_tabn!=0 then
free_tabn:=kt_max_tabn+1;
else
free_tabn:=min_tabn;
end if;
else
free_tabn:=0;
end if;
end if;

if free_tabn!=0 then
insert into kt (tabn) values (free_tabn);
commit;
end if;

commit;

insert into tmp_tabn (tabn) values (free_tabn);

end;


Наталия   (2003-04-03 09:36:00) [11]

Код покажи


Наверх

Титульная страница Поиск, карта сайта Написать письмо