Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2012, 04:40   #1
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию case и bulk collect в oracle 9i и выше

Код:
DECLARE
   TYPE mytype IS TABLE OF VARCHAR2 (20);
   mytable   mytype;
BEGIN
   SELECT 'abc'
   BULK COLLECT INTO mytable
     FROM DUAL;
END;

----------------------------------------------

DECLARE
   TYPE mytype IS TABLE OF VARCHAR2 (20);
   mytable   mytype;
BEGIN
   SELECT CASE
             WHEN 1 = 1
                THEN 'abc'
          END
   BULK COLLECT INTO mytable
     FROM DUAL;
END;
в первом случае все O'K
во втором выдается ошибка
Цитата:
ORA-06550: line 5, column 11:
PLS-00103: Encountered the symbol "CASE" when expecting one of the following:

( * - + all mod null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
table avg count current distinct max min prior sql stddev sum
unique variance execute the forall time timestamp interval
date <a string literal with character set specification>
<a number> <a single-quoted SQL string>
Вопросы:
1) почему bulk collect не ест case?
2) если нельзя использовать bulk collect с case, то как можно вывернуться?

пс: необходимо в pl/sql таблицу запихнуть содержимое большого запроса, в котором куча подзапросов и case'ов.

пс2: есть идея все case переделать в union'ы:
Код:
DECLARE
   TYPE mytype IS TABLE OF VARCHAR2 (20);

   mytable   mytype;
BEGIN
   SELECT text
   BULK COLLECT INTO mytable
     FROM (SELECT 'abc' text
             FROM DUAL
            WHERE 1 = 1
           UNION
           SELECT 'def'
             FROM DUAL
            WHERE 1 <> 1);
END;
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.

Последний раз редактировалось Sparkman; 27.02.2012 в 04:55.
Sparkman вне форума Ответить с цитированием
Старый 27.02.2012, 09:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Была похожая проблема. Решил ее двумя путями
1) Сделал функции, возвращающие таблицы, их и использовал (Работало но сложно получилось)
2) Выдавливал в временный курсор набор, а потом уже его применял в запросе.
P.S. PL SQL штука капризная, и явно недоделанная.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.02.2012, 10:03   #3
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Была похожая проблема. Решил ее двумя путями
1) Сделал функции, возвращающие таблицы, их и использовал (Работало но сложно получилось)
2) Выдавливал в временный курсор набор, а потом уже его применял в запросе.
P.S. PL SQL штука капризная, и явно недоделанная.
спасибо за ответ, но:
1) использование функций плохо сказывается на плане выполнения запросов
2) курсор, как и балк коллект возвращает ту же самую ошибку.

Единственная вещь, которая "ест" мою выборку, это таблицы. Но лишние таблицы в базе не нужны, а временные не дают использовать.
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 12.03.2012, 08:38   #4
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Чтобы тема не оставалась "мертвой", отвечу сам себе (как реализовал):
заменил все [case]ы на [union]ы - банально, но план запроса никак не пострадал, а [bulk collect] с удовольствием "сожрал" все это.
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чат+шифрование(128 и выше) MORPEH Работа с сетью в Delphi 6 12.12.2011 17:05
путь к файлу на каталог выше Magnetic Air Microsoft Office Excel 24 30.03.2011 01:17
Загрузка процессора с выше 50% Talemir Общие вопросы Delphi 8 14.01.2010 22:34