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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск функции plsql, Запуск функции plsql 
:(
    Опции темы
Kizja
Дата 30.3.2008, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я полный чайник в plsql, так что не бейте smile

Скажите, как запустить функцию, написанную на plsql – ну т.е. протестировать, что возвращает ? Например, если у меня есть функция, которая возвращает тип VARCHAR2, то запускал её 

Код

select funkcija() from dual;


А если у меня функция возвращает не VARCHAR2, а REF CURSOR, типа:

Код

FUNCTION funkcija()
   RETURN return_cur
IS
   cursor2 return_cur;
BEGIN
  ...
RETURN cursor2;
END;


return_cur - это тип REF CURSOR

То как мне её запустить? Т.е. как бы результатом является не 1 стринг, а много записей и в каждой несколько колонок. Запуская так же, как и предыдущий вариант, просто вываливается – наверное потому что „from dual“ предполагает только 1 значение или как? Вобщем, пожалуйста подскажите кто знает, как запустить!

PM MAIL   Вверх
batigoal
Дата 30.3.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 2
Всего: 151



Вопрос хороший...

Наверное, можно сделать "внешнюю" процедуру, которая будет дергать эту, а потом пробегаться по возвращенному ею ResultSet'у, выводя результаты в консоль.

Цитата(Kizja @  30.3.2008,  14:29 Найти цитируемый пост)
наверное потому что „from dual“ предполагает только 1 значение или как?

DUAL - это обычная таблица. Просто частенько её бывает удобно использовать, т.к. она имеет одну строку и один столбец. С тем же успехом ты мог протестировать свою первую функцию, введя в SQLPlus строку exec funkcija(). Ну а во втором случае возвращаемое значение просто невозможно неявно преобразовать в строковый тип.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Kizja
Дата 30.3.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



batigoal

Спасибо за ответ, а ты мог бы продемонстрировать как эта процедура могла бы выглядеть (хотя бы примерно) ?
PM MAIL   Вверх
DimW
Дата 31.3.2008, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(batigoal @  30.3.2008,  16:45 Найти цитируемый пост)
т.к. она имеет одну строку и один столбец.

по моему столбцов гораздо больше
Код

select 1 f1, 2 f2, 3 f3 from dual


Kizja, воспользуйся dbms_output.put_line при тестировании PL/SQL - блока, а потом заворачивай в функцию. 
PM MAIL ICQ   Вверх
batigoal
Дата 31.3.2008, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 2
Всего: 151



Цитата(DimW @  31.3.2008,  07:53 Найти цитируемый пост)
по моему столбцов гораздо больше

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


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
DimW
Дата 31.3.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(batigoal @  31.3.2008,  09:10 Найти цитируемый пост)
Не понял твою мысль.

Просто теоритическое изучение дуала прошло мимо меня...  smile 

PM MAIL ICQ   Вверх
Sqlninja
Дата 31.3.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

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



Kizja, а можно привести весь текст функции, которая возвращает ссылку на курсор? И для чего, по вашему, она предназначена?

вариант:
Код

DECLARE
   TYPE tRef IS REF CURSOR
      RETURN dual%ROWTYPE;

   lRef   tRef;

   TYPE tRes IS TABLE OF lRef%ROWTYPE;

   lRes   tRes;

   FUNCTION fRef
      RETURN tRef
   IS
      lRef   tRef;
   BEGIN
      OPEN lRef FOR
         SELECT *
           FROM dual;

      RETURN lRef;
   END fRef;
BEGIN
   lRef    := fRef;

   FETCH lRef
   BULK COLLECT INTO lRes;

   FOR i IN lRes.FIRST .. lRes.LAST
   LOOP
      DBMS_OUTPUT.put_line (lRes (i).dummy); -- dual замени на свою таблицу, dummy - на свои поля
   END LOOP;
END;
/



Это сообщение отредактировал(а) Sqlninja - 31.3.2008, 14:58


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

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

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

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

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

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


 




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


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

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