![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ODAC & ORAARRAY [D7, WinXP]
stepan_mk © (2005-10-11 17:40:00)Есть у меня на Оракле пакедж prm_law там есть описан тип
TYPE saldoArray IS VARRAY (7) OF NUMBER;
и функция
FUNCTION get_sud_borg(crem IN NUMBER, ug IN VARCHAR2, dt IN DATE, tp IN saldoArray) RETURN NUMBER;
из делфи мне надо етому параметру tp дать значения делаю так
SpogData: TOraQuery
...
SpogData.ParamByName('Arrtp').AsArray.OCISvcCtx:= Form1.Database.OCISvcCtx;
SpogData.ParamByName('Arrtp').AsArray.AllocObject('prm_LAW.saldoArray'); // здесь ошиПка
for i:=1 to 7 do
begin
if CheckListBox1.Checked[i-1]
then SpogData.ParamByName('Arrtp').AsArray.ItemAsInteger[i-1]:=i
else SpogData.ParamByName('Arrtp').AsArray.ItemAsInteger[i-1]:=0;
end;
Возникает ошиПка type "prm_law"."saldoarray" not fount
Seg (2005-10-12 16:29:00) [1]Проще надо программировать, проще...
stepan_mk (2005-10-12 16:28:00) [2]Смотрел я примери, там их два есть, но они какие то узкие масив только с клиента передаётся, а в моём случае ещё и параметром функции должен приниматся :(.
Val (2005-10-12 16:20:00) [3]Обошли проблему. Стоило бы посмотреть примеры работы с массивом на ODAC, думаю.
stepan_mk (2005-10-12 16:16:00) [4]
> Так объяви 7 переменных и все.
Уболтал!
Так и сделал.
Seg (2005-10-12 15:57:00) [5]Так объяви 7 переменных и все.
stepan_mk (2005-10-12 15:51:00) [6]
>
> Может в таком случае вернуть тип, объявленный ранее и попробовать
> на нем?
>
> TYPE saldoArray IS VARRAY (7) OF NUMBER;
Пробовал, ситауция та же.
А если в делфи поставить SArray:array[0..6] of integer;
то даже не компилируются
ошипка здесь SpogData.ParamByName('Arrtp').Value:=SArray;
несовместимость типов
Seg (2005-10-12 15:34:00) [7]Ето что-то типа array of integer в делфи.
Может в таком случае вернуть тип, объявленный ранее и попробовать на нем?
TYPE saldoArray IS VARRAY (7) OF NUMBER;
stepan_mk (2005-10-12 15:29:00) [8]
> На серверной части
> saldoArray IS TABLE OF NUMBER INDEX BY BINARY_INTEGER
> нет явного указания, что в этой таблице 7 строк
Ето что-то типа array of integer в делфи.
Seg (2005-10-12 15:22:00) [9]И как же скрестить массив с таблицей?
SpogData.ParamByName('Arrtp').Length:=7;
усерен, что создается 7 строк в таблице?
На серверной части
saldoArray IS TABLE OF NUMBER INDEX BY BINARY_INTEGER
нет явного указания, что в этой таблице 7 строк.
Может все-таки объявить 7 переменных и не париться?
stepan_mk (2005-10-12 15:17:00) [10]В ODAC я определил его как float PL/SQL Table
Seg (2005-10-12 14:39:00) [11]Причем здесь Оракл?
У тебя Делфи не принимает массив в параметр Arrtr.
Какой тип у параметра Arrtr?
stepan_mk (2005-10-12 14:28:00) [12]
> А что это за параметр, длинной 7?
В оракле он имеет тип
saldoArray IS TABLE OF NUMBER INDEX BY BINARY_INTEGER
Тоесть масив.
7 ето значит что он имеет 7 елементов
Визов функции с клиента виглядит так
select .... get_sud_borg(:codrem, :ugoda, :data, :Arrtp )
from ...
where ...
Seg (2005-10-12 14:25:00) [13]Arrtp
А что это за параметр, длинной 7?
Строка длинной 7 символов?
stepan_mk (2005-10-12 14:06:00) [14]Я уже пробовал разние варианти, последний такой
серверная часть
В пакедже
TYPE saldoArray IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
...
FUNCTION get_sud_borg(crem IN NUMBER, ug IN VARCHAR2, dt IN date, tp IN saldoArray ) RETURN NUMBER IS
В делфи
var SArray:array of integer;
...
SetLength(SArray,7);
for i:=0 to 6 do
SArray[i]:=i+1;
SpogData.ParamByName('Arrtp').Length:=7;
SpogData.ParamByName('Arrtp').Value:=SArray;
SpogData.Open; // Теперь ошиПка тут
ОшиПка теперь гласит
ERangeError with massage: index of array is not range
Тот самий вопрос обсуждается и здесь
http://www.sql.ru/forum/actualthread.aspx?tid=224717
Val (2005-10-12 13:56:00) [15]Думаю, автора - знает, раз есть .AsArray :)
А вот работает ли он или им не умеет пользоваться автор - другой вопрос - к знатокам ODAC.
Seg (2005-10-12 13:48:00) [16]Может и в компонентах доступа, но клиентская часть должна знать о существовании такого типа.
Val (2005-10-12 12:55:00) [17]а причем тут "Винды" ? этот тип может быть реализован в компонентах доступа.
Seg (2005-10-12 12:49:00) [18]Массив этот можно прекрасно использовать внутри Оракла.
Винды не знают такого типа данных. Можно попробовать использовать простой массив на стороне клиента, но 100% гарантии нет.
stepan_mk (2005-10-12 12:04:00) [19]
> А нельзя объявить параметры и дефолтовыми значениями?
>
> param1 in number default null,
> param2 in number default null
Честно говоря уже над етим начинаю подумивать, если за сегодня не добю ка массив, то буду делать через дефолтние значения
Seg (2005-10-12 11:33:00) [20]А нельзя объявить параметры и дефолтовыми значениями?
param1 in number default null,
param2 in number default null
и т.д.