Форум: "Базы";
Текущий архив: 2003.04.21;
Скачать: [xml.tar.bz2];
ВнизКак выполнить хранимую процедуру 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c