Найдено 7 результатов

Eugeni
Пн 22 сен 2014 08:05
Форум: Oracle Data Access Components
Тема: DataMapping. Поле с коллекцией видится как XML
Ответы: 4
Просмотры: 6377

Re: DataMapping. Поле с коллекцией видится как XML

Добрый день.
Небольшая поправка... Выборка идет из таблицы с Nested Table.

Вот небольшой пример.

Код: Выделить всё

CREATE TYPE T_TYPE_CHAIR IS TABLE OF VARCHAR2(100);
/

CREATE TABLE TBL_CHAIRS (ID NUMBER, CHAIR_NAME  UTL.T_TYPE_CHAIR)
   NESTED TABLE CHAIR_NAME STORE AS TBL_NESTED_CHAIRS;
/

INSERT INTO TBL_CHAIRS
VALUES (1, T_TYPE_CHAIR('стул','табуретка'));

INSERT INTO TBL_CHAIRS
 VALUES (2, T_TYPE_CHAIR('кресло','пуфик','диван'));

COMMIT;
Пакетик

Код: Выделить всё

create or replace package PKG_CHAIR is

  PROCEDURE CHAIR_SEL(OUT_CURSOR OUT SYS_REFCURSOR);

end PKG_CHAIR;
/
create or replace package body PKG_CHAIR is

PROCEDURE CHAIR_SEL(OUT_CURSOR OUT SYS_REFCURSOR)
AS
BEGIN
  OPEN OUT_CURSOR FOR
    SELECT *
      FROM Tbl_Chairs; 
END CHAIR_SEL;

end PKG_CHAIR;
Открываем пустой проект Delphi, в моем случае (XE2).
Бросаем OraSession и OraQuery.
В OraQuery пишем запрос

Код: Выделить всё

begin
  UTL.PKG_CHAIR.CHAIR_SEL(:OUT_CURSOR);
end;
Подключаем DBGrid к OraQuery.
Запускаем.
Запрос отрабатывает, во 2-ой колонке светится "(DATASET)". Всё правильно.
Теперь, добавим в OraSession преобразование XML в String(2000).
Запускаем.
Ошибка "Project Project1.exe raised exception class EUnsupportedDataTypeMapping with message 'Unsupported data type
mapping: "XML" to "String(2000)"'."


Исправил я эту ошибку, но это жесткий хак...
Модуль OraClasses, function TOCIRecordSet.GetFieldDesc8

Код: Выделить всё

      ....
      Field.SubDataType := FCommand.GetInternalType8(OraType, NationalCharset);
    {$IFNDEF LITE}
      Field.DBType := TOraConverterManager.GetDBType(OraType, NationalCharset);
     // Field.DBType - становиться oraXML, хотя Field.ObjectType.DataType = dtTable(=18)
     // Если в поляне XML то Field.ObjectType.DataType = dtXML(=37)
     // <-------- Добавил - Начало
      if OraType = SQLT_NTY then
        if Field.ObjectType<>nil then
          if (Field.ObjectType.DataType = dtTable) then
              Field.DBType := 29;
     // <-------- Добавил - Окончание
    ...
Запускаем. Работает...
Eugeni
Пт 19 сен 2014 10:32
Форум: Oracle Data Access Components
Тема: DataMapping. Поле с коллекцией видится как XML
Ответы: 4
Просмотры: 6377

DataMapping. Поле с коллекцией видится как XML

Добрый день.
В OraSession задал преобразование XML в String(2000).
В одном из запросов в курсоре есть поле с коллекцией.
На этом запросе DataMapping мне сообщает, что неправильное преобразование поля из XML в String(2000). А в запросе нет поля XML.
Ошибка при любом значении ObjectView.
Убрал преобразование, запрос отработал.
Обнаружил, что тип у поля с коллекцией определяется как oraXML = 121.
Как вылечить?
ODAC 9.3.10
Eugeni
Вт 22 июл 2014 13:25
Форум: Oracle Data Access Components
Тема: Получение строки с #13#10 из базы при ConvertEOL:=true
Ответы: 1
Просмотры: 3810

Получение строки с #13#10 из базы при ConvertEOL:=true

Добрый день.
При получении строки из функции с включенным ConvertEOL в OraSession и при условии, что перевод строки #10, возвращаемая строка получается меньше ожидаемой, при чем обрезаются данные.
После копания в коде обнаружил функцию, которая добавляет недостающий #13 в строку

Код: Выделить всё

function AddCRString(Source, Dest: IntPtr; Count: integer): integer;
В коде этой процедуры ошибка

Код: Выделить всё

  
  DestEnd   := PtrOffset(Dest, Count);
  while (PtrCompare(Source, SourceEnd) < 0) and (PtrCompare(Dest, DestEnd) < 0)
Цикл выполняется пока не достигли конца источника или ПРИЕМНИКА.
Мы не достигнем конца источника, если добавлен хотя бы один #13, второе условие сработает раньше.
Правильнее будет

Код: Выделить всё

  
  DestEnd   := PtrOffset(Dest, Count);
  while (PtrCompare(Source, SourceEnd) < 0) 
...
и
//  if PtrCompare(Dest, DestEnd) > 0 then // last char was CRLF
//    Dest := DestEnd;
Тоже самое в функции

Код: Выделить всё

function AddCRUnicode(Source, Dest: IntPtr; Count: integer): integer;
Eugeni
Пт 16 май 2014 11:28
Форум: Oracle Data Access Components
Тема: Длина значения в строковом параметре процедуры?
Ответы: 1
Просмотры: 4012

Длина значения в строковом параметре процедуры?

Добрый день.
Подскажите какой длины значение можно записать во входной строковый(ftString) параметр процедуры и какой максимальной длины строку можно получить из выходного строкового параметра?

Оказывается только 4000. Маловато. Большая просьба увеличить до 32768.
Проверил работает. Править здесь
function TOCIConnection.GetMaxStringSize: word;
Eugeni
Ср 23 апр 2014 08:17
Форум: Oracle Data Access Components
Тема: TDataSetProvider + TOraQuery с полем XMLType = Проблема
Ответы: 5
Просмотры: 6739

Re: TDataSetProvider + TOraQuery с полем XMLType = Проблема

Отлично, что на этой неделе.
Только еще одно замечание.
Неплохо было бы предусмотреть маппинг для всех типов данных, которые введены сверх стандартного TFieldType.
Сейчас сообщение об неизвестном типе получил для TOraIntervalField.
Eugeni
Вт 22 апр 2014 19:09
Форум: Oracle Data Access Components
Тема: TDataSetProvider + TOraQuery с полем XMLType = Проблема
Ответы: 5
Просмотры: 6739

Re: TDataSetProvider + TOraQuery с полем XMLType = Проблема

Спасибо. Буду ждать новую версию.
Eugeni
Вт 22 апр 2014 07:35
Форум: Oracle Data Access Components
Тема: TDataSetProvider + TOraQuery с полем XMLType = Проблема
Ответы: 5
Просмотры: 6739

TDataSetProvider + TOraQuery с полем XMLType = Проблема

Добрый день.

Есть OraQuery, возвращает столбец XMLTYPE. К OraQuery прикреплен TDataSetProvider.
При попытке обратится к провайдеру за данными.
var
OutData : Variant;
begin
OutData := DataSetProvider.Data;
end;

Начинает орать что неизвестный тип данных.
Исследования показали, что провайдер, да и вообще Delphi, ничего не знают про тип данных ftXML.
Этот тип ввели в ODAC. В OraQuery создается поле типа TOraXMLField.

Можно ли их как-нибудь подружить? хоть в строку его преобразовать(В DOA так и было)
Не хотелось бы свой провайдер писать.
В провайдере TOraProvider тоже нет ни слова про XML. DataMapping тоже не поддерживает этот тип.
В серверный код вмешиваться не могу, да и нереально отследить все такие места.

Delphi XE2 + ODAC 8.6.12 (Direct:=false) + Oracle 11g
Установка 9.2.7 не помогла.