powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с NestedTable
25 сообщений из 39, страница 1 из 2
Работа с NestedTable
    #39882216
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем гуру!

Есть такая проблема. Нужно с клиента Delphi (Embarcadero 10.1 Berlin) передать в БД (Oracle 18c) через компоненты ODAC (версия 10.3.9) таблицу с данными.
Покопавшись на просторах сети решил использовать компонент TOraNestedTable.

На сервере создал два типа:
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE OR REPLACE TYPE REE_REC as object
(
--тут 45 полей, не буду все перечислять
);

CREATE OR REPLACE TYPE REE_TAB AS TABLE OF REE_REC



Первый тип полностью соответствует структуре таблицы CLREE, в которую нужно будет вносить передаваемые данные.

Данные заношу так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
procedure TfrmCreateLoadFiles.UploadFile;
var
  LNestTable: TOraNestedTable;
begin
  --
  try
      LNestTable := TOraNestedTable.Create(nil);
      LNestTable.Table := TOraNestTable.Create
        (TOraType.Create(DefSession.OCISvcCtx, 'REE_TAB'));
      LNestTable.Open;
      --
      LNestTable.Append;
      LNestTable.FieldByName('FKEY').Value := FCurFileKey;
      LNestTable.FieldByName('LINE_N').Value := LLineN;
      LInd := 0;
      while Pos(chr(9), LText) > 0 do
      begin
        LVal := Copy(LText, 1, Pos(chr(9), LText) - 1);
        LNestTable.FieldByName(FRealColumnNames[LInd]).Value := Trim(LVal);
        Inc(LInd);
        Delete(LText, 1, Pos(chr(9), LText));
      end;
      LNestTable.FieldByName('F_PR').Value := '-';
      LNestTable.FieldByName('FIL').Value := FFileType;
      LNestTable.Post; //вот тут при фиксации значения всех полей записи превращаются в Null
      --
      NewImportFile_1061(LNestTable);
      --
    finally
      FreeAndNil(LNestTable);
    end;
--



Суть проблемы в том, что при вызове LNestTable.Post значения всех столбцов превращается в Null.
После LNestTable.Append ставил LNestTable.Edit, но сути это не поменяло.

Посему вопрос: как мне записать данные в LNestTable?
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882229
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nested table is a dataset component that encapsulates a database table that is nested as a field within another table. Use TOraNestedTable to access data contained in a nested dataset. A nested table provides much of the functionality of a table component, with the difference that the data it accesses is stored in a nested table.

Даже гугло перевод и то говорит, что компонент не подходит для этого:

Вложенная таблица - это компонент набора данных, который инкапсулирует таблицу базы данных, которая вложена как поле в другую таблицу. Используйте TOraNestedTable для доступа к данным, содержащимся во вложенном наборе данных. Вложенная таблица обеспечивает большую часть функциональности компонента таблицы, с той разницей, что данные, к которым она обращается, хранятся во вложенной таблице.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882230
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И по мелочи: Append и Post должны быть внутри цикла, а не за его пределами. Но ошибка тут не в этом.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882232
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще по мелочи
Код: pascal
1.
      LNestTable := TOraNestedTable.Create(nil);

должно быть ДО

Код: pascal
1.
  try

а не после
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882241
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanИ по мелочи: Append и Post должны быть внутри цикла, а не за его пределами. Но ошибка тут не в этом.

Они и так внутри
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882244
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если копать глубже, то мне надо из текстового файла перенести данные в таблицу.
Логичнее всего было использовать TOraLoader. Для примера я его и использовал.Работал шустро, 43 ГБ залил всего за 2.5 часа.
Но проблема в том, что я не могу дать пользователю права на запись непосредственно в таблицу. Вот и приходится извращаться.
Как вариант хотел передать таблицей как параметр процедуры, благо TOraStoredProc позволяет это.
А так как параметр должен быть TOraNestTable, то и возникла мысль использовать TOraNestedTable
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882245
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийwadmanИ по мелочи: Append и Post должны быть внутри цикла, а не за его пределами. Но ошибка тут не в этом.

Они и так внутри
Я увидел в приведенном коде иное.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882246
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийНо проблема в том, что я не могу дать пользователю права на запись непосредственно в таблицу. Вот и приходится извращаться.
Есть еще один способ: залить во временную таблицу (без индексов заливка будет еще быстрее) и затем дернуть оракловую процедуру, которая из временной раскидает записи как угодно.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882269
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЕсть еще один способ: залить во временную таблицу (без индексов заливка будет еще быстрее) и затем дернуть оракловую процедуру, которая из временной раскидает записи как угодно.
Эта мысль была реализована, но опять таки всё упирается в права доступа.
Создавать заранее таблицу нельзя, потому как потом придется бороться с параллельной заливкой.
Если создавать по ходу выполнения закачки, то как выдать права на созданную таблицу от владельца?
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882272
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЯ увидел в приведенном коде иное.

Интересно, что именно? Между Append и Post есть только цикл, в котором по полям ОДНОЙ ЗАПИСИ разносятся данные.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882277
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийСоздавать заранее таблицу нельзя, потому как потом придется бороться с параллельной заливкой.

С чего бы вдруг? Временные таблицы разных сессий никак не взаимодействуют.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882303
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovС чего бы вдруг? Временные таблицы разных сессий никак не взаимодействуют.

Есть 2 пользователя БД. Один владелец схемы (назовем его OWN_USER), второй - пользователь,
который пользуется приложением (путь будет ARM_USER).
ARM_USER вызывает пакетную процедуру, в которой происходит создание временной таблицы, со схемы OWN_USER.
Временная таблица создается от OWN_USER. Её будет видеть ARM_USER? Нет, потому что надо дать на нее права.
Насколько я помню, права не выдаются моментально, нужно открыть новую сессию. Для АРМа это не подходит.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882305
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийARM_USER вызывает пакетную процедуру, в которой происходит создание временной таблицы

"Уже смешно." (с)

Не надо так делать. Динамические метаданные - путь в никуда. Создай таблицу один раз и
потом используй её.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882315
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийИнтересно, что именно?
Что цикл в коде только один, а append и post - за его пределами.

Леонов ЮрийЕсть 2 пользователя БД. Один владелец схемы (назовем его OWN_USER), второй - пользователь,
который пользуется приложением (путь будет ARM_USER).
Это легко разруливается. Быстрее сделать, чем ждать ответы и рассуждать, почему нельзя.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882316
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Дело в том, что политика заказчика не позволяет писать данные прямо в таблицу. Только через пакеты.
Все таблицы обернуты вьюшками и права только на select
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882324
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Леонов ЮрийDimitry Sibiryakov,

Дело в том, что политика заказчика не позволяет писать данные прямо в таблицу. Только через пакеты.
Все таблицы обернуты вьюшками и права только на select

ну сделай пакет, который будет использоваться для записи в таблицу.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882328
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

А если добавить в пакет процедуру, которая будет добавлять 1 строчку в NESTED TABLE?
Если хотите, можно даже готовым объектом REE_REC передавать. Если нет, то отдельными полями.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882329
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Ну так а я о чем?! Суть проблемы описал, но свели в никуда своими комментариями.
Я же с того и начал, что использую TOraNestedTable для передачи данных в пакетную процедуру,
в которой и состоится запись всех данных в таблицу.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882330
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён Леонов Юрий,

А если добавить в пакет процедуру, которая будет добавлять 1 строчку в NESTED TABLE?
Если хотите, можно даже готовым объектом REE_REC передавать. Если нет, то отдельными полями.

Ну, 70 миллионов записей будет довольно таки долго добавляться.
Смысл был передавать блоками по 2-5 тысяч строк и вставка вида
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
  procedure ImportFile_1061(PData ree_tab) is
  begin
    insert into fgv_clree
      (--перечень полей
      )
      select tt.*
        from TABLE(CAST(PData AS ree_tab)) tt;
  end ImportFile_1061;
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882364
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

здесь иногда отвечают программисты из Devart. Может сегодня уже :)
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882379
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён Леонов Юрий,

здесь иногда отвечают программисты из Devart. Может сегодня уже :)

Да, я знаю. Очень сильно помогают, кстати.
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882414
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийЯ же с того и начал, что использую TOraNestedTable для передачи данных в пакетную процедуру

Тут нужен не nested table, а table variable.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882441
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТут нужен не nested table, а table variable.


Ну если точнее то TOraArray. TOraNestTable как раз наследник его
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882454
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийНу если точнее то TOraArray. TOraNestTable как раз наследник егоВот и используй TOraArray как параметр TOraStoredProc. Для каких тебе удобств эта обёртка-то..?
...
Рейтинг: 0 / 0
Работа с NestedTable
    #39882616
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ma1tusЛеонов ЮрийНу если точнее то TOraArray. TOraNestTable как раз наследник егоВот и используй TOraArray как параметр TOraStoredProc. Для каких тебе удобств эта обёртка-то..?

Тут походу тупик. Я использую Direct подключение, и мне бьет ошибку "OCI function is not linked". Почитал на форуме Devart,
там пишут, что "Такие типы как OBJECT, ARRAY, REF, XML, BINARY_DOUBLE, BINARY_FLOAT не поддерживаются в Direct режиме. "
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с NestedTable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]