Небольшая поправка... Выборка идет из таблицы с 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;
Бросаем OraSession и OraQuery.
В OraQuery пишем запрос
Код: Выделить всё
begin
UTL.PKG_CHAIR.CHAIR_SEL(:OUT_CURSOR);
end;
Запускаем.
Запрос отрабатывает, во 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;
// <-------- Добавил - Окончание
...