powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как работать с BULK COLLECT INTO
25 сообщений из 27, страница 1 из 2
Как работать с BULK COLLECT INTO
    #36114251
shapovalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

есть такая вот процедура,
Код: plaintext
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.
CREATE OR REPLACE PACKAGE BODY raws_owner.oracle_search
AS
   PROCEDURE simple_search (
      searchterm          VARCHAR2,
      searchergpn         NUMBER,
      p_res         OUT   t_res
   )
   AS
      v_temp_table   search_result_type_tbl;
   BEGIN
      SELECT search_result_type (a.ID, 'Attachment', a.NAME)
      BULK COLLECT INTO v_temp_table
        FROM attachments a
       WHERE contains (a.NAME, searchterm) >  0 
          OR contains (a.DATA, searchterm) >  0 ;

      SELECT search_result_type (obi.obi_itsrm_id, 'Obi', obi.title)
      BULK COLLECT INTO v_temp_table
        FROM t_obi_itsrm obi
       WHERE contains (obi.title, searchterm) >  0 ;

-- возвращается только результат этого запроса. остальные удаляются
      SELECT search_result_type ('id', 'test', 'hello world')
      BULK COLLECT INTO v_temp_table
        FROM DUAL;
        
      OPEN p_res FOR
         SELECT *
           FROM TABLE (v_temp_table);
   END;
END oracle_search;

Она должна возвращать набор строк из всех таблиц.
Но возвращает только строку из последнего запроса.
Что тут не так? Как можно сделать чтобы возвращались строки из всех запросов?

Спасибо.
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114254
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shapovalov,

1. массив очищается
2. используйте union двух запросов
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114266
shapovalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да с юнионом было бы проще, но у оракла есть баг Unpublished Bug 5476507 который не позволяет это сделать. А обновить базу до 10.2.0.4 у меня нет возможности.
так что приходится как то обходиться другими способами.

А можно как то сделать чтобы этот массив не очищался?
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114271
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shapovalov,

Код: plaintext
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.
CREATE OR REPLACE PACKAGE BODY raws_owner.oracle_search AS
  PROCEDURE simple_search (searchterm VARCHAR2, searchergpn NUMBER, p_res OUT t_res) AS
    v_temp_table   search_result_type_tbl;
  BEGIN
    SELECT search_result_type (a.id, 'Attachment', a.name)
    BULK COLLECT
    INTO v_temp_table
    FROM attachments a
    WHERE contains (a.name, searchterm) >  0  OR contains (a.data, searchterm) >  0 
    UNION ALL
    SELECT search_result_type (obi.obi_itsrm_id, 'Obi', obi.title)
    BULK COLLECT
    INTO v_temp_table
    FROM t_obi_itsrm obi
    WHERE contains (obi.title, searchterm) >  0 
    UNION ALL
    SELECT search_result_type ('id', 'test', 'hello world')
    BULK COLLECT
    INTO v_temp_table
    FROM DUAL;

    i := v_temp_table.FIRST;

    WHILE (i IS NOT NULL) LOOP
      -- Ваша обработка тут
      i := v_temp_table.NEXT (i);
    END LOOP;
  END;
END oracle_search;
Уберите функцию - и будет вам счастье
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114278
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragrafУберите функцию - и будет вам счастьеИ где она тут, по-твоему?
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114279
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragrafshapovalov,

1. массив очищается присваивается при каждом BULK COLLECT INTO новый, свеженький...
2. используйте union двух запросов
shapovalov,

используйте промежуточную коллекцию для каждого запроса, после запроса перекидывайте данные из неё в коллекцию-результат. И насчёт бага: он относительно union all в запросе или относительно запроса и коллекции?
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114296
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragraf
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    SELECT search_result_type (a.id, 'Attachment', a.name)
    BULK COLLECT
    INTO v_temp_table
    FROM attachments a
    WHERE contains (a.name, searchterm) >  0  OR contains (a.data, searchterm) >  0 
    UNION ALL
    SELECT search_result_type (obi.obi_itsrm_id, 'Obi', obi.title)
    BULK COLLECT
    INTO v_temp_table
    FROM t_obi_itsrm obi
    WHERE contains (obi.title, searchterm) >  0 

Классно... Oracle Database 12z?
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114297
shapovalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял какую функцию убрать?
в любом случае так не получается, ошибка
ORA-01744: inappropriate INTO

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

хотел вначале временные таблички использовать, но у оракла они по другому используются чем в sql server так что не получилось.
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114304
shapovalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLer,

а можно поподробнее, как это? создать еще одну временную переменную типа search_result_type_tbl?
но она же тоже будет очищаться после каждого инсерта?
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114306
shapovalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLer,

баг возникает если сделать такой вот запрос
Код: plaintext
1.
2.
3.
4.
SELECT 'Attachment' as Attachment, a.id, a.name  FROM attachments a
WHERE CONTAINS(a.name, :searchTerm) >  0  or contains(a.data, :searchTerm)> 0 
union
select 'Obi' as Obi, obi.OBI_ITSRM_ID, obi.title from t_obi_itsrm obi where contains(obi.title, :searchTerm)> 0 
ORA-00600: internal error code, arguments: [kkslrslc:4], [0], [1], [], [], [], [], []
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114307
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shapovalovНужно делать селекты по разным табличкам, а потом все результаты вернуть как один большой селект веб приложению.RTFM Returning Multiple Rows with Table Functions (FAQ)
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114311
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicoragrafУберите функцию - и будет вам счастьеИ где она тут, по-твоему?
Код: plaintext
1.
SELECT search_result_type (a.ID, 'Attachment', a.NAME)
suPPLer,
описАлся, понятно же.
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114313
Another_newbie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shapovalov,

Код: plaintext
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.
33.
34.
35.
36.
CREATE OR REPLACE PACKAGE BODY raws_owner.oracle_search
AS
   PROCEDURE simple_search (
      searchterm          VARCHAR2,
      searchergpn         NUMBER,
      p_res         OUT   t_res
   )
   AS
      v_temp_table1   search_result_type_tbl;
      v_temp_table   search_result_type_tbl;
   BEGIN
      SELECT search_result_type (a.ID, 'Attachment', a.NAME)
      BULK COLLECT INTO v_temp_table
        FROM attachments a
       WHERE contains (a.NAME, searchterm) >  0 
          OR contains (a.DATA, searchterm) >  0 ;

      v_temp_table1  := v_temp_table;

      SELECT search_result_type (obi.obi_itsrm_id, 'Obi', obi.title)
      BULK COLLECT INTO v_temp_table
        FROM t_obi_itsrm obi
       WHERE contains (obi.title, searchterm) >  0 ;
      
      v_temp_table1  := v_temp_table1  MULTISET UNION v_temp_table;

      SELECT search_result_type ('id', 'test', 'hello world')
      BULK COLLECT INTO v_temp_table
        FROM DUAL;
        
      v_temp_table1  := v_temp_table1  MULTISET UNION v_temp_table;

      OPEN p_res FOR
         SELECT *
           FROM TABLE (v_temp_table1);
   END;
END oracle_search;
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114317
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shapovalov,

Вариант 1. Складываем коллекции через MULTISET UNION ALL
Код: plaintext
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.
33.
34.
CREATE OR REPLACE PACKAGE BODY raws_owner.oracle_search
AS
   PROCEDURE simple_search (
      searchterm          VARCHAR2,
      searchergpn         NUMBER,
      p_res         OUT   t_res
   )
   AS
      v_temp_table   search_result_type_tbl;
      v_res_table   search_result_type_tbl;
   BEGIN
      SELECT search_result_type (a.ID, 'Attachment', a.NAME)
      BULK COLLECT INTO v_temp_table
        FROM attachments a
       WHERE contains (a.NAME, searchterm) >  0 
          OR contains (a.DATA, searchterm) >  0 ;
      v_res_table := v_temp_table;

      SELECT search_result_type (obi.obi_itsrm_id, 'Obi', obi.title)
      BULK COLLECT INTO v_temp_table
        FROM t_obi_itsrm obi
       WHERE contains (obi.title, searchterm) >  0 ;
      v_res_table := v_res_table MULTISET UNION ALL v_temp_table;

-- возвращается только результат этого запроса. остальные удаляются
      SELECT search_result_type ('id', 'test', 'hello world')
      BULK COLLECT INTO v_temp_table
        FROM DUAL;
      v_res_table := v_res_table MULTISET UNION ALL v_temp_table;
        
      OPEN p_res FOR
         SELECT *
           FROM TABLE (v_res_table);
   END;
END oracle_search;


Вариант 2. Вообще без коллекций, просто открываем курсор
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE OR REPLACE PACKAGE BODY raws_owner.oracle_search
AS
   PROCEDURE simple_search (
      searchterm          VARCHAR2,
      searchergpn         NUMBER,
      p_res         OUT   t_res
   )
   AS
   BEGIN
      OPEN p_res FOR
      SELECT search_result_type (a.ID, 'Attachment', a.NAME)
        FROM attachments a
       WHERE contains (a.NAME, searchterm) >  0 
          OR contains (a.DATA, searchterm) >  0 
       union all
      SELECT search_result_type (obi.obi_itsrm_id, 'Obi', obi.title)
        FROM t_obi_itsrm obi
       WHERE contains (obi.title, searchterm) >  0 
       union all
      SELECT search_result_type ('id', 'test', 'hello world')
        FROM DUAL;
   END;
END oracle_search;
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114318
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragrafElic[quot oragraf]Уберите функцию - и будет вам счастьеИ где она тут, по-твоему?
Код: plaintext
1.
SELECT search_result_type (a.ID, 'Attachment', a.NAME)
С конструкторами не знаком?
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114321
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
suPPLer

Только уберите из второго варианта приведения к типу. :)
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114323
shapovalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо. Получилось.
suPPLer твой второй вариант оказалось то что нужно.
В этом случае ораклового бага нет, т.к. нет binding variables
:)
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114348
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicС конструкторами не знаком? Я понимаю, что ты, скорее всего, прав. Скорее всего, search_result_type - это описание типа, а не функция. Но в опубликованном ТС посте описания этого типа не было, как не было и описания этой функции. Значит, мое предположение имеет право на жизнь. Или у тебя была инсайдерская инфа относительно типа?
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114352
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oragrafЗначит, мое предположение имеет право на жизнь.Имеющий глаза да увидит :)автор
Код: plaintext
1.
2.
v_temp_table   search_result_type_tbl;
SELECT         search_result_type (...)
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #36114380
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicИмеющий глаза да увидит :)автор
Код: plaintext
1.
2.
v_temp_table   search_result_type_tbl;
SELECT         search_result_type (...)
Я согласен с тобой, я ж написал.
-------------
Код: plaintext
1.
2.
3.
4.
5.
6.
( Препод )Ты даже не представляешь, что мы сейчас сделали с тобой на этом вот месте.
Мы взяли и  прямо вот сломали стереотип. Не надо, не запоминайте этого слова.
А то запомните и все, и вся память занята! Давайте закрепим, закрепим. 
Попроще вопрос - русский ученый-химик, который изобрел таблицу Менделеева и назвал её своим именем Менделеева?! Ну?!
( Студент ):  Ну, у меня два варианта.. 
( П ): Вот видите, да? Вот что значит сломать стереотип! Раз - и два варианта! Ну, давайте, давайте оба!
( С ): Ну, Крупский и Делчев.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как работать с BULK COLLECT INTO
    #38429563
Kalimaah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста!
Дали задание: "Так, ты вот при инициализации пакета в BULK селектни данные из этой таблички, чтобы ее по многу раз не дергать".
Могу в процедуре так сделать, в функции, но вот при инициализации... на форуме не ищется, Яндексы и гуглы не выдают ничего вразумительного.
Спасибо
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #38429575
Хуяндех
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kalimaah на форуме не ищется, Яндексы и гуглы не выдают ничего вразумительногоЗато ты нашел вот это, да? Скопипастил, сделал морду кирпичом типа чета искал и напрягался. Это ВСЕ пишут кому не лень типа никто не догадается
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #38429583
Kalimaah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ХуяндехKalimaah на форуме не ищется, Яндексы и гуглы не выдают ничего вразумительногоЗато ты нашел вот это, да? Скопипастил, сделал морду кирпичом типа чета искал и напрягался. Это ВСЕ пишут кому не лень типа никто не догадается

Не хочешь отвечать - промолчи, орать ни на кого не надо. Не копируй свою модель поведения на окружающих
...
Рейтинг: 0 / 0
Как работать с BULK COLLECT INTO
    #38429610
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kalimaahно вот при инициализации ... на форуме не ищетсяRTFM CREATE PACKAGE BODY Statement
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как работать с BULK COLLECT INTO
    #39289166
knek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, пожалуйста, как можно обратиться к созданной таблице "a"
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE
   TYPE emp_typ IS TABLE OF b%ROWTYPE INDEX BY PLS_INTEGER;
   a emp_typ;

begin
 SELECT * BULK COLLECT INTO a FROM b;

 for i in (select * from a) -- здесь ошибка: нет таблицы "a"
 loop
  dbms_output.put_line(i.field1);
 end loop;
end; 
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как работать с BULK COLLECT INTO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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