Форум: "Базы";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
ВнизКак в связке БДЕ+Оракл результат запроса вернуть? Найти похожие ветки
← →
Duce (2002-09-11 18:42) [0]Уважаемые, пособите в меру добродетельности!
Как пользуя Оракл7,БДЕ и Дельфи6 вернуть в программу набор данных из хранимой процедуры/функции через TStoredProc?
Заранее признателен...
← →
Peter Gluhiy (2002-09-11 22:01) [1]Сначала выполняеш:
StoredProc1.ExecProc
Получаеш результат:
Text := StoredProc1.ParamByName("Название параметра").AsString
← →
oss (2002-09-11 22:53) [2]главное в процедуре правильно определи тип параметра
← →
Suntechnic (2002-09-11 23:40) [3]>Peter Gluhiy © (11.09.02 22:01)
Человек интересовался как набор данных получить, а не просто строковый параметр.
>Duce © (11.09.02 18:42)
Делаешь примерно как написал Peter Gluhiy ©, только возвращаемым параметром ставишь курсор Oracle. Ну и соответственно процедура должна возвращать курсор из Oracle.
← →
roottim (2002-09-12 09:56) [4]а в чем проблема?
связка все таже. StoredProc - DataSource - Grid(или что там)
← →
Дмитрий Орехов (2002-09-12 10:34) [5]Я не уверен, что Oracle позволяет возвращать в качестве параметра хранимой процедуры набор данных. Сам не пробовал, но кто-то мне так сказал.
← →
Val (2002-09-12 10:50) [6]>Duce © (11.09.02 18:42)
спрашивал в другой вашей ветке и в этой спрошу - зачем вам для этого данный компонент, если спокойно можно работать с квери. Спортивный интерес?
← →
xGrey (2002-09-12 15:50) [7]В ощем виде.
Серверная часть:
PACKAGE PKG_TEST as
type Cur is ref cursor;
procedure TST(rCur in out Cur);
END;
PACKAGE body PKG_TEST as
procedure TST(rCur in out Cur) as
begin
open rCur for
select .........
end;
END;
Клиентская часть:
sp : TStoredProc
DB : TDatabase
sp.DatabaseName:=DB.DatabaseName;
sp.StoredProcName :="ИМЯ_ПАКЕТА.ИМЯ_ПРОЦЕДУРЫ";
in out параметр RCUR должен иметь тип ftCursor
Если в хр. процедуре есть входные (in) параметра, то присваиваем им значения.
sp.Open;
Если в хр. процедуре есть выходные (out) параметры, то забираем из них значения.
← →
Duce (2002-09-13 14:40) [8]> Val
Нет, никаких абстрактных принципов, если так можно,
то прошу вразумить:) Я очень порадуюсь такому решению и с
удовольствием воспользуюсь.
> Все благородные люди. ОК! Все получилось, хотя с некоторыми напрягами. В рантайм делаю Prepare, лезет Exception в духе
неизвестный тип данных, обрабатываю его - ставлю ftCursor.
На клозе/опен почемуто начинаются какие-то неприятности - делаю
TParam.Clear - чтобы гарантированно.
Спасибо за консалт! Надеюсь буду и Вам полезен:)
← →
xGrey (2002-09-13 15:01) [9]> лезет Exception в духе неизвестный тип данных....
По умолчанию тип Oracle ref cursor воспринимается Delphi как ftUnknown.
Измените его на ftCursor до обращения к хранимой.
То, как Вы это обрабытываете уж больно оригинально....
← →
Val (2002-09-13 15:04) [10]Query.Close;
Query.SQL.Clear;
Query.SQL.Text := "select * from MY_SUPER_SP(:Value1,:Value2)";
Query.ParamByName("Value1").AsInteger := 157;
Query.ParamByName("Value2").AsString := "anything, what I want";
Query.Open;
← →
Duce (2002-09-13 15:27) [11]> xGrey
так у меня набор параметров вариативный. Но вот курсор присутствует обязательно. Поэтому я список параметров не заполняю, а получаю после Prepare. Или не прав?
> К Val : а как выглядит MY_SUPER_SP?
← →
Val (2002-09-13 15:42) [12]как ХП, возвращающая набор данных
← →
Duce (2002-09-13 16:08) [13]TYPE curtype1 is ref cursor;
function GetIt return curtype1 as
retval curtype1;
begin
open retval for
select * from ar_ins_voc_status;
return retval;
end;
А потом есесно вызов в указанном виде...
Это не работает. Милости прошу подробнее, если не в тягость.
← →
xGrey (2002-09-13 16:46) [14]> так у меня набор параметров вариативный
К моменту вызова хранимой она должна существовать на сервере и соотв ее параметры и их типы уже известны.
Параметры компонента TSoredProc леко настраиваются через инспектор объектов.
Если Вы исп. перегрузку хранимых, то можно, для настройки параметров перегруженной процедуры сделать так:
var P : TParam;
......................
p:=TParam.Create(sp.Params,ptInputOutput);
p.Name:="RCUR";
p.DataType:=ftCursor;
.............................
Для курсора из моего примера от 12.09.02 15:50.
> Это не работает>
Не используйте ф-цию, используйте процедуру. Это - работает.
См мой пост от 12.09.02 15:50.
← →
Duce (2002-09-16 10:25) [15]> к XGray - да, таким образом все получилось. Просто специфика в том, что имя вызываемой процедуры берется из таблицы адекватно пользовательскому запросу->заранее проца неизвестна, мы пристегиваем компоненту имя и пошел анализ аргументов.
> Val не работает таким образом. А хотелось бы попробовать.
Не благоволите ли все же кодом ХП изумить? :)
Ибо в моем порочном варианте:
CREATE OR REPLACE procedure GetIt1(astatus IN number DEFAULT 140, aCursor IN OUT PKG_CURSOR.curtype1)
is
begin
open aCursor for
select * from voc_status where status=astatus;
end;
при обращении через вышеописанный SELECT получаю ожидаемый
ORA-00933 SQL command not properly ended
← →
roottim (2002-09-16 11:46) [16]обязателен ли БДЕ?
можно перейти на ODAC, причем безболезненно (есть миграция от БДЕ компонент к ODAC).
работаю с ними.. курсоры возвращает! и очень много что есть приятного.
← →
Duce (2002-09-16 11:51) [17]А вот это интересно!! Я вообще в свое время перетечь на
Direct Oracle Access думал(работал с ним). Но ODAC - это другой продукт, если не ошибаюсь? Насколько легко мигрировать, если есть какая матчасть, доки, введения и выведения в возможности, как с выходом под новые версии D(у меня 6-ка)-
очень порадуюсь.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c