Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранимые процедуры и запрос, Oracle 
:(
    Опции темы
LSD
Дата 24.3.2004, 22:47 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Нужно написать процедуру которая бы возвращала таблицу. Проблема в том что SQL запрос получается очень большим и превышает максимальную длинну varchar, и просто так его не выполнишь. Что делать?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
stron
Дата 24.3.2004, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Консультант
***


Профиль
Группа: Комодератор
Сообщений: 1654
Регистрация: 17.7.2003
Где: Питер

Репутация: нет
Всего: 36



Извиняюсь, но я что-то не понял.
Какой SQL запрос получается очень большим?(чего к чему)



--------------------
подписи нет
PM ICQ   Вверх
LSD
Дата 25.3.2004, 21:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



В поцедуре нужно выполнить select и вернуть результат пользователю. Так вот строка для этого select-а превышает (вернеее может превышать в зависимость от базы и переданных параметров) размерность varchar и помещается только в CLOB, как выполнить такой запрос?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
maxi
Дата 10.11.2004, 09:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мне кажется, что надо тебе запрос упростить. Наклевать каких - нить VIEWS, подзапросы, хостпеременные и т.д. Вообще я впервые встречаюсь с запросом, который бы превышал такое офигитительное ограничение.
  Вверх
LSD
Дата 10.11.2004, 20:25 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



В данном случае надо один столбес таблицы развернуть в несколько, по условию содержащемуся в других столбцах.
На данный момент работает такая схема: процедура на сервере генерирует запрос и в CLOB, возвращает его клиенту, тот выполняет его.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
AntonSaburov
Дата 11.11.2004, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



А эта тема не поможет ?

http://forum.vingrad.ru/index.php?showtopic=4483
PM MAIL WWW ICQ   Вверх
LSD
Дата 11.11.2004, 20:42 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



К сожалению нет smile , возвращать курсор из процедуры я уже умею. Не получается его получить, из-за его большого размера самого текста запроса.
Я не совсем четко сформулировал вначале задачу, из-за чего возникло недопонимание.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Medved
Дата 11.11.2004, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 1
Всего: 154



Если честно, я тоже никогда не сталкивался с запросами такого размера. Даже не знаю, что посоветывать. Ищите какой-то обходной путь, чтобы уменьшить размер запроса. Или обратитесь в корпорацию Oracle. Они внимательно относятся к своим клиентам.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonSaburov
Дата 12.11.2004, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



Читал, что Oracle8i и Oracle9i позволяют создавать "табличные функции". Эти функции возвращают результирующий набор данных и из него можно делать выборки.

Но я их не пробовал, потому только даю направление.
PM MAIL WWW ICQ   Вверх
LSD
Дата 12.11.2004, 18:53 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(AntonSaburov @ 12.11.2004, 18:42)
Читал, что Oracle8i и Oracle9i позволяют создавать "табличные функции".

А как они называются на английском (что бы можно было поискать)?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
AntonSaburov
Дата 15.11.2004, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



Цитата(LSD @ 12.11.2004, 19:53)
А как они называются на английском (что бы можно было поискать)?

Прямо с доки перекидаю пример - разбирайся smile. Решаемая задача - в зависимости от типа животного создать детей - количество зависит от типа животного.

1. Определить вложенный табличный тип:
Код

CREATE TYPE pet_t IS OBJECT (
   NAME VARCHAR2(60),
   breed VARCHAR2(100),
   dob DATE);
)

CREATE TYPE pet_nt IS TABLE OF pet_t;


2. Создаем функцию, которая возвращает табличный тип.
Код

CREATE OR REPLACE FUNCTION pet_family(dad_in IN pet_t, mom_in IN pet_t)
   RETURN pet_nt
IS
   l_count PLS_INTEGER;
   retval pet_nt := pet_nt();

   PROCEDURE extend_assign(pet_in IN pet_t) IS
   BEGIN
       retval.EXTEND;
       retval(retval.LAST) := pet_in;
   END;
BEGIN
   extend_assign(dad_in);
   extend_assign(mom_in);

   IF mom_in.breed = 'RABBIT' THEN l_count := 12;
   ELSEIF mom_in.bread = 'DOG' THEN l_count := 4;
   ELSEIF mom_in.bread = 'KANGAROO' THEN l_count := 1;
   END IF;

   FOR indx IN 1 .. l_count
   LOOP
       extend_assign(pet_t('BABY' || indx, mom_in.bread, SYSDATE));
   END LOOP;

   RETURN retval;
END;


3. Делаем запрос. Если внимательно по коду посмотреть, то по идее все ясно. Функция получает на входе папу и маму кроликов и возвращает список детей.
Но одно НО - я не запускал этот пример реально smile
Код

SELECT * FROM TABLE (CAST (
           pet_family (
               pet_t ('Hoppy', 'RABBIT', SYSDATE),
               pet_t ('Hippy', 'RABBIT' SYSDATE)
           ) AS pet_nt
       ));


PM MAIL WWW ICQ   Вверх
igon
Дата 6.12.2004, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Текст селекта разрезать на части приемлемой длины и передать их a1, a2...aN параметрам хранимой процедуры.

В хранимой
execute immediate (a1|| a2||...||aN)


--------------------
Хотите поговорить об этом?
PM   Вверх
LSD
Дата 8.12.2004, 00:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



igon
Не поможет, т.к. dynamic SQL не может превышать 32к. А именно это ограничение и надо преодолеть. Единственный выход это пакет DBMS_SQL, но я не могу понять как из него вытащить курсор.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
igon
Дата 8.12.2004, 04:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Ну не хе-хе себе - >32К!!!!
Это ж >= 15 страниц plain текста, причем плотного, без пустот и красоты!!!
Я-то подумал, что ты вышел за лимит 4К.
Слушай, это творение надо лицезреть - я как про легенду слышал про 4-страничные. Если это не коммерческая тайна - выложи куда-нить: очень любопытно посмотреть smile

Может, и соображения появятся какие-нибудь.
Так, если структура запроса постоянна и варьируют только параметры, можно отдельные подзапросы оформить как функции, например.
Есть еще способ динамической генерации хранимой, ее компиляции и выполнения - вот это, чует мое сердце, тебе должно помочь. Правда, там используются прямые INSERT в SYS.SOURCE$ - не каждый DBA это одобрит.

Цитата
На данный момент работает такая схема: процедура на сервере генерирует запрос и в CLOB, возвращает его клиенту, тот выполняет его.

Кстати, здесь все правильно?
Что это за клиент, который выполняет то, что не по зубам серверу?

Это сообщение отредактировал(а) igon - 8.12.2004, 05:54


--------------------
Хотите поговорить об этом?
PM   Вверх
<Spawn>
Дата 8.12.2004, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



А почему на поместить курсор в пакет и не использовать его? Что то наподобии этого:

Код

create or replace package pck_open_cursor
is
 cursor c_open_cur is (select * from ftp_files);
 procedure open_cur;
 procedure close_cur;
end;
/

create or replace package body pck_open_cursor
is
 procedure open_cur
 is
 begin
   open c_open_cur;
 end;

 procedure close_cur
 is
 begin
   close c_open_cur;
 end;
end;
/


set serveroutput on;

declare
 table_fields ftp_files%rowtype;
begin
 pck_open_cursor.open_cur;
 --Тут можно организовать цикл извлечения данных
 fetch pck_open_cursor.c_open_cur into table_fields;
 dbms_output.put_line(table_fields.file_id);
 pck_open_cursor.close_cur;
end;
/


Это сообщение отредактировал(а) <Spawn> - 8.12.2004, 21:25


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0915 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.