Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ODAC & ORAARRAY [D7, WinXP]


Страницы:   1 2

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

и т.д.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо