Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-67129
Avreliy
2003-04-02 18:59
2003.04.21
Столбцы DBGrid!


6-67414
matlash
2003-02-20 15:37
2003.04.21
Панель для MS Internet Explorer.


14-67447
Steven
2003-04-02 14:02
2003.04.21
Кто-нибудь видел компоненты с Win CE?


1-67260
di
2003-04-11 11:46
2003.04.21
arcsin


7-67578
Avsam
2003-03-02 23:45
2003.04.21
Список дисков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский