Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как работать с BULK COLLECT INTO / 25 сообщений из 27, страница 1 из 2
28.07.2009, 18:28:56
    #36114251
shapovalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
Привет.

есть такая вот процедура,
Код: 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
28.07.2009, 18:30:26
    #36114254
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
shapovalov,

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

А можно как то сделать чтобы этот массив не очищался?
...
Рейтинг: 0 / 0
28.07.2009, 18:38:53
    #36114271
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
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
28.07.2009, 18:42:19
    #36114278
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
oragrafУберите функцию - и будет вам счастьеИ где она тут, по-твоему?
...
Рейтинг: 0 / 0
28.07.2009, 18:42:36
    #36114279
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
oragrafshapovalov,

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

используйте промежуточную коллекцию для каждого запроса, после запроса перекидывайте данные из неё в коллекцию-результат. И насчёт бага: он относительно union all в запросе или относительно запроса и коллекции?
...
Рейтинг: 0 / 0
28.07.2009, 18:48:25
    #36114296
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
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
28.07.2009, 18:49:08
    #36114297
shapovalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
Не понял какую функцию убрать?
в любом случае так не получается, ошибка
ORA-01744: inappropriate INTO

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

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

а можно поподробнее, как это? создать еще одну временную переменную типа search_result_type_tbl?
но она же тоже будет очищаться после каждого инсерта?
...
Рейтинг: 0 / 0
28.07.2009, 18:53:20
    #36114306
shapovalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
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
28.07.2009, 18:54:39
    #36114307
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
shapovalovНужно делать селекты по разным табличкам, а потом все результаты вернуть как один большой селект веб приложению.RTFM Returning Multiple Rows with Table Functions (FAQ)
...
Рейтинг: 0 / 0
28.07.2009, 18:56:34
    #36114311
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
ElicoragrafУберите функцию - и будет вам счастьеИ где она тут, по-твоему?
Код: plaintext
1.
SELECT search_result_type (a.ID, 'Attachment', a.NAME)
suPPLer,
описАлся, понятно же.
...
Рейтинг: 0 / 0
28.07.2009, 18:58:44
    #36114313
Another_newbie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
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
28.07.2009, 19:00:33
    #36114317
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
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
28.07.2009, 19:01:20
    #36114318
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
oragrafElic[quot oragraf]Уберите функцию - и будет вам счастьеИ где она тут, по-твоему?
Код: plaintext
1.
SELECT search_result_type (a.ID, 'Attachment', a.NAME)
С конструкторами не знаком?
...
Рейтинг: 0 / 0
28.07.2009, 19:02:17
    #36114321
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
suPPLer

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

Не хочешь отвечать - промолчи, орать ни на кого не надо. Не копируй свою модель поведения на окружающих
...
Рейтинг: 0 / 0
16.10.2013, 13:32:12
    #38429610
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
Kalimaahно вот при инициализации ... на форуме не ищетсяRTFM CREATE PACKAGE BODY Statement
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
09.08.2016, 17:26:53
    #39289166
knek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работать с BULK COLLECT INTO
Подскажите, пожалуйста, как можно обратиться к созданной таблице "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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как работать с BULK COLLECT INTO / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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