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

Есть такая проблема. Нужно с клиента 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
28.10.2019, 11:35
    #39882229
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с NestedTable
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
28.10.2019, 11:36
    #39882230
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с NestedTable
И по мелочи: Append и Post должны быть внутри цикла, а не за его пределами. Но ошибка тут не в этом.
...
Рейтинг: 0 / 0
28.10.2019, 11:37
    #39882232
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с NestedTable
еще по мелочи
Код: pascal
1.
      LNestTable := TOraNestedTable.Create(nil);

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

Код: pascal
1.
  try

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А если добавить в пакет процедуру, которая будет добавлять 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
28.10.2019, 15:57
    #39882364
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с NestedTable
Леонов Юрий,

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

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

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

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


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

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


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