Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Есть ли встроенные PL/SQL табличные типы для BULK COLLECT? / 8 сообщений из 8, страница 1 из 1
08.07.2021, 16:59
    #40082726
Sergey_Osipov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли встроенные PL/SQL табличные типы для BULK COLLECT?
Здравствуйте.
Хочу написать конвейерную функцию PIPELINED, но не хочу объявлять табличный тип.
Вот на такую конструкцию компилятор ругается, мол такой тип не поддерживается конвейерными функциями.
Это потому что тип dbms_sql.varchar2a объявлен как index by binary_integer.
Есть ли встроенные табличные типы не объявленные как index by binary_integer? Спасибо.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create or replace function get_result2(tablename in varchar2) return dbms_sql.varchar2a pipelined
is
  result dbms_sql.varchar2a;
  sqlstr varchar2(32767);
begin
    sqlstr := 'select ''Hello World'' from dual';

   execute immediate sqlstr bulk collect into result;

   for i in result.first .. result.last loop
      pipe row(result(i));
   end loop;

   return;
end;
...
Рейтинг: 0 / 0
08.07.2021, 17:02
    #40082728
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли встроенные PL/SQL табличные типы для BULK COLLECT?
Код: plsql
1.
2.
CREATE OR REPLACE NONEDITIONABLE TYPE SYS.ODCIVarchar2List FORCE
 AS VARRAY(32767) OF VARCHAR2(4000);


Код: plsql
1.
select sys.odcivarchar2list('Hello', 'world') from dual;
...
Рейтинг: 0 / 0
08.07.2021, 17:25
    #40082744
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли встроенные PL/SQL табличные типы для BULK COLLECT?
Sergey_Osipov,

Сказка для научных сотрудников младшего возраста...
Саваоф Баалович стал всемогущ. Он мог все. И он ничего не мог.
Потому что граничным условием уравнения Совершенства оказалось требование,
чтобы чудо не причиняло никому вреда.
Никакому разумному существу. Ни на Земле, ни в иной части Вселенной.
...


Для начала, зачем Вам это нужно?

памятка:
HOWTO :: Как правильно задавать вопросы
Как мне оформить свое сообщение?
Студентам, желающим помощи

1) Полная постановка задачи (без сокращений)
...

p.s.
Использовать Dynamic SQL нужно только в крайнем случае.
У Вас бесконечное число таблиц, которые Вы будете использовать в Вашей процедуре, или Вы постоянно создаете разовые таблицы?
Скорее всего нет, поэтому, количество требуемых pipelined функций без использования Dynamic SQL будет ограниченным (и как правило относительно небольшим).

Стандартных вариантов решения два:
1) Создать временную таблицу фиксированного типа для генерации отчетов, где любые данные будут в виде строк varchar2 и одну функцию для pipe row

2) Создаете таблицу со списком нужных таблиц и пишите генератор табличных типов и связанных с ним pipe row функций.
Есть еще такая возможность как перегрузка имен.
...
Рейтинг: 0 / 0
08.07.2021, 18:21
    #40082762
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли встроенные PL/SQL табличные типы для BULK COLLECT?
из документированных:
...
Рейтинг: 0 / 0
08.07.2021, 19:38
    #40082770
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли встроенные PL/SQL табличные типы для BULK COLLECT?
Sergey_Osipov
не хочу объявлять табличный тип.
Самый сопровождабелный путь - таки объявить.
...
Рейтинг: 0 / 0
09.07.2021, 08:16
    #40082845
Sergey_Osipov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли встроенные PL/SQL табличные типы для BULK COLLECT?
Sayan Malakshinov,

Спасибо. Так сработало.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or replace function get_result2(tablename in varchar2) return ora_name_list_t pipelined
is
  result ora_name_list_t;
  sqlstr varchar2(32767);
begin
    sqlstr := 'select ''Hello World'' from ' || tablename;

   execute immediate sqlstr bulk collect into result;

   for i in result.first .. result.last loop
      pipe row(result(i));
   end loop;

   return;
end;

select * from table(get_result2('dual'))
...
Рейтинг: 0 / 0
16.07.2021, 13:52
    #40084365
elunin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли встроенные PL/SQL табличные типы для BULK COLLECT?
Код: plsql
1.
2.
3.
select t.*
  from all_source t 
 where upper(t.text) like '%TABLE OF VARCHAR2%'


далее по доступности пакета.
...
Рейтинг: 0 / 0
19.07.2021, 16:35
    #40084690
Sah
Sah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть ли встроенные PL/SQL табличные типы для BULK COLLECT?
Если установлен APEX, то можно использовать:
Код: plsql
1.
2.
apex_t_varchar2
apex_t_number
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Есть ли встроенные PL/SQL табличные типы для BULK COLLECT? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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