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

Вниз

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

 
lightix   (2003-04-03 09:28) [0]

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


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

Код покажи


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

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;


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

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


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

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


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

Все это указывал. Безрезультатно.
процедуру оформлял как функцию:
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:27) [6]

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


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

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


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

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


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

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


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

Это уже ошибка 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 11:29) [11]

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

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



Страницы: 1 вся ветка

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
3-67090
MXA
2003-04-02 18:43
2003.04.21
Число измененных записей


1-67313
NetKnight
2003-04-07 09:56
2003.04.21
Variant To Int


14-67502
Bel
2003-04-03 10:44
2003.04.21
А как тут можно залогиниться?


3-67103
Иван
2003-04-02 14:42
2003.04.21
Можно ли применить запрос к DataSet ?


1-67344
Андреев Павел
2003-04-09 13:27
2003.04.21
Создание формы в dll