powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
19 сообщений из 19, страница 1 из 1
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266286
SerjantGB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, перерыл интернет на предмет наличия универсального способа обработки SYS_REFCURSOR. Наткнулся здесь, мол можно через pipelined (попробовал, но предопределение столбцов не устраивает), через ODCI - увы очень мало информации об этом и в основном на аглицком. А я с ним очень плохо дружу! Нужна помощь! Кто может сталкивался, кто что знает - буду рад любой информации!

Собственно что я хочу:

Код: plsql
1.
2.
3.
rec1 sys_refcursor

select * from rec1


Уже была тема , но там пользователь с ником dbms_photoshop написал
dbms_photoshop1. Самый банальный способ - pipelined. Ищи в доке и гугле.
2. Самый универсальный - odcitable. Ищи в доке и гугле.
3. Самый извращенный - XML. Ищи в форуме.

и больше ничего не говорил об этом. А меня именно заинтересовал второй способ!!! Все потом вертелось вокруг pipelined функции. Так как автора того поста это устраивало - на этом они и остановились. А я вот нехочу каждый раз предопределять параметры (ленивый я, да...) и хочу один раз написать процедурину или пакет и пользоваться им заменяя километровые коды описания временных таблиц или что еще хуже создание физических таблиц - двумя строчками!

Может я плохо искал (вроде нет), может я неправильно задавал вопросы в гугле - но в результате я не смог пробиться дальше чем 3-4 основных моментов создания ODCI Table.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266301
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGB,

искать пытались?
доку/книжки читать пытались?
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266309
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGB,

В 99% случаев гонящиеся за суперуниверсальносьтю делают это либо из-за неправильного дизайна либо из-за неумения пользоваться инструментами.

ODCITable весьма кривая штука, которая неявно создает типы SYS%== .
С таким же успехом можно написать свой собственный велосипед, который будет генерить DDL.

Я нашел применение этой технологии лишь раз - при выполнении MDX запросов к SSAS из Оракла, но это очень экзотический случай.
Просто MDX в отличие от SQL может возвращать произвольное число столбцов так же как и строк.

А, да, работает технология с точностью до хард парса. С реф курсорами будет вдвойне криво. :)
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266329
SerjantGB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Очень рад что вы ответили! Быть может вы все-таки прольете свет на данную тему.
Ведь я хочу как лучше!

До этого работал в MS-SQL.
Очень удобно там реализована функция временной таблицы.
В PL-SQL эта же функция сопровождается (как минимум) описанием столбцов.
Да, я не буду спорить на тему своего криворукогонеумелого кодинга и знания инструментов. Но хочется все же выпрямить свои рукинаучиться умело пользоваться инструментами, и разобраться в конце-концов (пусть и на своих же ошибках) как лучше выполнить ту или иную задачу.

Я кстати не полностью описал то что я хочу (может кто-то конечно и догадался, но лишний раз думаю уточнить можно).

На входе я имею неизвестный набор данных any_table.
Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select.
Не понимаю, почему такой способ не используется - ведь он был бы очень удобен.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266347
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGBНа входе я имею неизвестный набор данных any_table.
Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select.
Не понимаю, почему такой способ не используется - ведь он был бы очень удобен.При переходе с MSSQL на Оракл надо смириться с тем, что тип результата надо определять.
Процедура не может возвращать рекордсет совершенно различной структуры (иначе как через реф курсор или XML) в отличие от MSSQL.

Можно долго холиварить на тему хорошо это или плохо, но это так и я считаю что это гуд.
Хотя с другой стороны динамические языки типа перла, пайтона и скала, которые определяют типы на лету это тоже хорошо, но это из другой оперы.

Возвращаясь к твоей проблеме, если набор данных возвращается на клиент применяй себе реф курсор, он для этого и создан.
Если возвращаемый набор данных должен быть обработан в PL/SQL или использован как часть другого SQL запроса - возвращай его как SQL коллекцию.
При этом создав столько коллекций сколько необходимо. Можно ограничиться какой-то универсальной со множеством полей.
Все равно код так или иначе обрабатывает определенные поля рекодсета, не так ли?
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266367
SerjantGB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopSerjantGBНа входе я имею неизвестный набор данных any_table.
Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select.
Не понимаю, почему такой способ не используется - ведь он был бы очень удобен.При переходе с MSSQL на Оракл надо смириться с тем, что тип результата надо определять.
Процедура не может возвращать рекордсет совершенно различной структуры (иначе как через реф курсор или XML) в отличие от MSSQL.

Можно долго холиварить на тему хорошо это или плохо, но это так и я считаю что это гуд.
Хотя с другой стороны динамические языки типа перла, пайтона и скала, которые определяют типы на лету это тоже хорошо, но это из другой оперы.

Возвращаясь к твоей проблеме, если набор данных возвращается на клиент применяй себе реф курсор, он для этого и создан.
Если возвращаемый набор данных должен быть обработан в PL/SQL или использован как часть другого SQL запроса - возвращай его как SQL коллекцию.
При этом создав столько коллекций сколько необходимо. Можно ограничиться какой-то универсальной со множеством полей.
Все равно код так или иначе обрабатывает определенные поля рекодсета, не так ли?

Так вот как раз, именно этого и хотелось бы избежать. То так писать, то эдак. Таблицы к 3 НФ не приведены, в результате чего приходится использовать множество вложенных запросов/процедур, которые в свою очередь плодят никому ненужные данные, а так же засоряют базу (в последствии) неиспользуемыми процедурами/функциями/таблицами.

И затем сидишь в этом бардаке и думаешь, зачем это все написали. Именно поэтому я и хочу изучить этот способ. У нас на предприятии у всех руки кривые никто не знает даже что такое ODCI, хотя вроде все настолько кривожопые умные что мне еще учиться у них. И все вместо временных таблиц создают физические таблицы в БД. В общем база такая что черт ногу сломает.

Я видел способ написания подобной процедуры через dbms_sql, но база настроена таким образом, что обратившись один раз к полям курсора, больше не пускает и пишет что прав нету. В инете смотрел эту проблему - там много говорили о том что с этими правами лишний раз лучше не играть. Хотя и код процедуры был предоставлен. Я честно скажу что я наложил кирпичей просто побоялся использовать данный метод и решил продолжить поиски.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266466
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGBТаблицы к 3 НФ не приведены, в результате чего приходится использовать множество вложенных запросов/процедур, которые в свою очередь плодят никому ненужные данные, а так же засоряют базу (в последствии) неиспользуемыми процедурами/функциями/таблицамиЛучше бороться с выделенным.
Наивно думать что есть silver bullet которая превратит г в конфетку.

Кстати, непонятно как неприведение к 3НФ влият на расплод дерьма в базе.
Если у вас хранилище а не OLTP там 3НФ и не нужна. Если что-то комбинированое, то и решение будет комбинированным.

В твоем случае уход от нормализации наоборот может помочь для сохранения результатов работы разных процедур/функций в широкой денормализированной таблице и последующей работы с этой таблицей. А может это будет говнодизайн. Все решают детали.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266472
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGB,

Несмотря на отсутвтвие универсальных решений, есть два универсальных совета.
1) Не стоит применять одинаковые паттерны проектирования в MSSQL и Oracle.
2) Без английского мало мальски толковым разработчиком не станешь.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39266482
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGBНа входе я имею неизвестный набор данных any_table.
Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select.
Не понимаю, почему такой способ не используется - ведь он был бы очень удобен.
Потому что способ обработки данных подразумевает, что структуру набора Вы всё-таки знаете. Или обработка такая же универсальная? Напишите подробней, пожалуйста.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39267085
SerjantGB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLerSerjantGBНа входе я имею неизвестный набор данных any_table.
Необходимо обработать данные, дополнить и изменить, и выполнить к этому всему простой select.
Не понимаю, почему такой способ не используется - ведь он был бы очень удобен.
Потому что способ обработки данных подразумевает, что структуру набора Вы всё-таки знаете. Или обработка такая же универсальная? Напишите подробней, пожалуйста.

Структура в каждом отдельном случае всегда известна.
Но содержать и помнить в голове каждый отчет, по 2 - 3 тыс. строк кода с неограниченной вложенностью процедур невозможно.
При этом каждая такая процедура (как вложенная, так и базовая) может использовать по 1 - 2 физических таблиц для временного хранения данных. И когда настает момент, (изменения в бух. учете например) когда надо поменять всего пару столбцов, и найти нужные строки посреди необъятного, но еще и мало знакомого кода (то что как правило написано - писал не я) - уходит от 1го дня.
Поэтому я и ищу решение для избавления от создания предопределенных временных таблиц.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39267200
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGB,

если всё так, как Вы описываете, то пришла пора платить технический долг по проекту: рефакторинг, создание базы отчётов, документирование, комментирование и т.д. Решение из сабжа только добавляет к необъятному и малознакомому коду ещё немного. Если спросите у коллег, вполне может оказаться, что часть этого уже есть. И даже, что кто-то где-то использует "универсальную процедуру". Или использовал, но забыл, потому что надо было запомнить 2-3 тысячи строк кода, которые формируют отчёт. :)

SerjantGBСтруктура в каждом отдельном случае всегда известна.
...
Поэтому я и ищу решение для избавления от создания предопределенных временных таблиц
Я спрашивал про обработку. Если она в каждом случае "надо поменять пару столбцов" различна, то универсальная процедура по обработке не существует. Придётся писать N конвейеров, каждый со своей логикой обработки. Тогда и использовать сильный REF CURSOR со специализированными коллекциями не проблема.

Но без анализа малознакомого кода (и проекта) это всё костыли.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39267745
SerjantGB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLer,

suPPLerЯ спрашивал про обработку. Если она в каждом случае "надо поменять пару столбцов" различна, то универсальная процедура по обработке не существует. Придётся писать N конвейеров, каждый со своей логикой обработки.

Обработка скриптов - это одно дело, другое дело, когда приходится править таблицу которую может использовать данная процедура.
Приведу пример:
1) Есть процедура использующая таблицу "студенты_tmp(id, Name, kurs)" в результате работы этой процедуры в данную таблицу складываются такие данные, которые можно потом выбрать простым селектом в отчет crystal reports.
2) Так же есть процедура которая так же использует эту таблицу с такими же столбцами и тоже, но уже по-своему (например с группировкой по Курсу) собирает данные в эту же таблицу.

Таблица очищается в начале выполнения процедур.

Теперь нам надо изменить второй отчет так, чтобы появился новый столбец, но вот беда, нам мешают старые(например столбцы которые являются NOT_NULL или UNIQUE). Если удалим их - перестанет работать первый отчет. В результате для второго отчета создаем еще одну таблицу с нужными столбцами.

Таких примеров полно и все бы ничего если бы хотя бы знать в каких отчетах и как фигурируют такие таблицы, но увы, за 15 лет проб и ошибок (не моих) их наплодилось неимоверное количество.

Если писать через "with" - пропадает возможность обновления/дополнения тех данных, которые попали в один из селектов, можно конечно записывать все в курсоры - тогда пропадает возможность объединения данных из нескольких селектов, либо это сильно затруднено.

Через pipelined-функцию делал и получилось в результате
Код: plsql
1.
select * from TABLE(func(SYS_REF_CUR)) where ...

но для этого приходится каждый раз предопределять тип данных передаваемых в функцию func. Практически равносильно предопределению временной таблицы как это изначально задумано в Oracle.

Все это не подходит для более простой и универсальной обработке данных.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39267748
SerjantGBзнать в каких отчетахЕсли плодить таблицы, не ведя "бухгалтерию", то и плоди дальше, зачем знать где оно используется?
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39267888
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGBПриведу пример:
1) Есть процедура использующая таблицу "студенты_tmp(id, Name, kurs)" в результате работы этой процедуры в данную таблицу складываются такие данные, которые можно потом выбрать простым селектом в отчет crystal reports.
2) Так же есть процедура которая так же использует эту таблицу с такими же столбцами и тоже, но уже по-своему (например с группировкой по Курсу) собирает данные в эту же таблицу.

Таблица очищается в начале выполнения процедур.

Теперь нам надо изменить второй отчет так, чтобы появился новый столбец, но вот беда, нам мешают старые(например столбцы которые являются NOT_NULL или UNIQUE). Если удалим их - перестанет работать первый отчет. В результате для второго отчета создаем еще одну таблицу с нужными столбцами.

Таких примеров полно и все бы ничего если бы хотя бы знать в каких отчетах и как фигурируют такие таблицы, но увы, за 15 лет проб и ошибок (не моих) их наплодилось неимоверное количество.

Пример ничего не поменял в ситуации. Либо чистить авгиевы конюшни с высочайшего царского соизволения, либо смириться и вносить свою толику навоза, либо уходить.

SerjantGBЕсли писать через "with" - пропадает возможность обновления/дополнения тех данных, которые попали в один из селектов, можно конечно записывать все в курсоры - тогда пропадает возможность объединения данных из нескольких селектов, либо это сильно затруднено.
Я, честно говоря, не понял, почему невозможно в запросе изменить данные, которые он вернёт. Хоть с WITH, хоть с inline view. И не понял, использовали ли Вы банальные коллекции, представления и нормальные временные таблицы, вообще как-то оптимизировали процедуры формирования отчётов, пытались выделить общие компоненты в модули, убрать лишние зависимости и т.д. Зато вижу, что у Вас есть нормальный зуд разработчика применить "крутую фишку", потому что она кажется Вам похожей на то, что Вы использовали в другой СУБД, вместо того чтобы вникать в проект. :) Но это будет ещё один универсальный способ/таблица/процедура/подход среди сотен тех, из которых складывается бардак у Вас на проекте. Следующий новичок будет спрашивать здесь про то же самое и "зачем здесь ещё и слой с ODCITable в двух с половиной отчётах".
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39268443
SerjantGB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLer,

Вы правы :) Хочется и новую фишку, но про слой с ODCITable я с вами не согласен. Ведь в конечном итоге должен получиться тип, при помощи которого будет реализовываться вся работа.
То есть то что я изначально написал - то и должно получиться, только с небольшими изменениями:
Код: plsql
1.
2.
3.
rec1 sys_refcursor;
select * from my_type(rec1);
--где my_type - мой тип с ODCI



Разве не замечательно?
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39268444
SerjantGB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем покумекав немного, я потихоньку вроде начал въезжать что же это такое, и решил что надо как-то к практике уже продвигаться, вроде понял что надо написать что-то вроде этого, но пока опять затык. Нужен совет, как правильно?
Вот что примерно я хочу:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
      MEMBER FUNCTION ODCITableFetch(
                                     self   IN OUT REF_TABLE,
                                     nrows  IN     NUMBER,
                                     objSet OUT    SYS.ANYDATASET
                                   ) RETURN PLS_INTEGER
        IS
            elem_typ SYS.ANYTYPE;
        BEGIN
            SYS.ANYDATASET.BeginCreate(
                                       SYS.DBMS_TYPES.TYPECODE_OBJECT,
                                       tmt,
                                       objSet
                                      );
                objSet.Addinstance;
                objSet.PieceWise;
                LOOP
--                  objSet.SetNumber();
                  FETCH self.cur INTO self.sctx;
                  EXIT WHEN self.cur%NOTFOUND;
                  PIPE ROW(self.sctx);
                END LOOP;
                objSet.Endcreate;
            RETURN ODCICONST.SUCCESS;
      END;
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39268445
SerjantGB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот спецификация:
Код: plsql
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.
CREATE OR REPLACE TYPE REF_TABLE
    AUTHID CURRENT_USER
    AS OBJECT(
              tmt        SYS.ANYTYPE,
              cur        SYS_REFCURSOR,
              STATIC FUNCTION ODCITableStart(
                                             sctx     IN OUT REF_TABLE,
                                             cur      IN SYS_REFCURSOR
                                            ) RETURN PLS_INTEGER,
              STATIC FUNCTION ODCITablePrepare(
                                               sctx     OUT REF_TABLE,
                                               tf_info  IN  SYS.ODCITabFuncInfo,
                                               cur      IN SYS_REFCURSOR
                                              ) RETURN PLS_INTEGER,
              MEMBER FUNCTION ODCITableFetch(
                                             self   IN OUT REF_TABLE,
                                             nrows  IN     NUMBER,
                                             objSet OUT    SYS.ANYDATASET
                                            ) RETURN PLS_INTEGER,
              MEMBER FUNCTION ODCITableClose(
                                             self IN REF_TABLE
                                            ) RETURN PLS_INTEGER,
              STATIC FUNCTION ODCITableDescribe(
                                                rtype    OUT SYS.ANYTYPE,
                                                cur      IN SYS_REFCURSOR
                                               ) RETURN PLS_INTEGER
             )
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39268446
зачем?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SerjantGBРазве не замечательно?
Код: plsql
1.
SQL> print рефкурсор

Для клиента рефкурсор такой же курсор как и любой другой, оборачивание в селект излишне. plsql со статическим связыванием с неопределенным селектом напрямую работать не умеет на этапе компиляции, а с рефкурсором хоть как-то.
...
Рейтинг: 0 / 0
Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
    #39268447
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerjantGBНужен совет, как правильноТебе уже два человека озвучили в каком направлении двигаться. Но поскольку ты не согласен, то тебе остаётся надеяться что в топик заглянет кто-то еще знающий ODCITable и либо разделяющий твои взгляды по поводу костылей либо просто желающий помочь тебе выстрелить самому себе в ногу.

PS. Видимо ты совсем плохо понимаешь что такое реф курсор и что значит "работает технология с точностью до хард парса".
У тебя ничего не получится с таким уровнем понимания, но может что новое узнаешь. Пилите, Шура, пилите.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как создать временную ODCI table без предопределения параметров и заполнить (нужна помощь)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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