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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать функцию возвращающую ТАБЛИЦУ 
:(
    Опции темы
Atomic63
Дата 23.3.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Выручайте проблема такая.  Нужна функция которая возвращает таблицу. Функция содержит 2 параметра A и B например:

Function base(a varchar, b var char) return X (Вместо Х должна возвращаться таблица)
X:=a+b;
end base;

Помогите пожалуйста
PM MAIL   Вверх
Sqlninja
Дата 23.3.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Какая таблица? Ты имеешь ввиду набор данных из одного столбца?


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
LSD
Дата 23.3.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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





--------------------
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   Вверх
Sqlninja
Дата 23.3.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

CREATE TYPE t_tab IS TABLE OF VARCHAR2 (50);

CREATE OR REPLACE FUNCTION tab_func (
   p_a   IN   VARCHAR2,
   p_b   IN   VARCHAR2
)
   RETURN t_tab
IS
   l_result   t_tab;
BEGIN
   SELECT p_a || p_b
   BULK COLLECT INTO l_result
   FROM   DUAL;

   RETURN l_result;
END tab_func;

SELECT tab_func ('a', 'b')
FROM   DUAL;




--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Atomic63
Дата 23.3.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Таблица уже существует мне нужно из 2 varchar получить имя этой таблицы и полученный результат уже дальше использовать в хранимой процедуре как таблицу
PM MAIL   Вверх
DimW
Дата 23.3.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Atomic63 @  23.3.2007,  14:41 Найти цитируемый пост)
мне нужно из 2 varchar получить имя этой таблицы 


т.е. тебе нужно просто вернуть результат конкетинации двух параметров?
а в целом сложно понять что тебе нужно... 

Цитата(Atomic63 @  23.3.2007,  14:18 Найти цитируемый пост)
Нужна функция которая возвращает таблицу.

именно из этого следует что резулитатом функции является либо индексная табцица либо вложенная либо массив...

что конкретно ты хочешь?
 

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


Новичок



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

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



Я хочу использовать результат этой функции  как таблицу!

Например      


Select  * from     MyPackage.MyFunction 


ВОТ!

Добавлено @ 15:10 
Получается что для того что бы запрос 
Select  * from     MyPackage.MyFunction 
работал надо что бы MyFunction определялась как таблица!


PM MAIL   Вверх
LSD
Дата 23.3.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Atomic63 @  23.3.2007,  15:08 Найти цитируемый пост)
Я хочу использовать результат этой функции  как таблицу!

И я и Sqlninja, уже дали тебе пример таких функций, потрудись с ними разобраться!


--------------------
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   Вверх
Sqlninja
Дата 23.3.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



тебе надо писать динамический SQL. так как это запрос, то надо открывать под него курсор;
Код

CREATE OR REPLACE PROCEDURE tab_proc (
   c_name   IN   VARCHAR2,
   t_name   IN   VARCHAR2
)
IS
   TYPE t_cur IS REF CURSOR;

   l_cur   t_cur;
   l_res   VARCHAR2 (120);
BEGIN
   OPEN l_cur FOR 'select ' || c_name || ' from ' || t_name;

   FETCH l_cur
   INTO  l_res;

   DBMS_OUTPUT.put_line (l_res);

   CLOSE l_cur;
END;
/

BEGIN
   tab_proc ('table_name', 'user_tables');
END;
/




--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
Atomic63
Дата 26.3.2007, 06:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за код. А не подскажете как его вставить в хранимую процедуру (Я совсем новичок в SQL помогите пожалуйста)
PM MAIL   Вверх
Atomic63
Дата 26.3.2007, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И еще вопрос эту процедуру можно только для SELECT использовать? 
PM MAIL   Вверх
Sqlninja
Дата 28.3.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Atomic63 @  26.3.2007,  06:15 Найти цитируемый пост)
А не подскажете как его вставить в хранимую процедуру 


Какой именно код нужно вставить в хранимую процедуру?


Цитата(Atomic63 @  26.3.2007,  07:40 Найти цитируемый пост)
И еще вопрос эту процедуру можно только для SELECT использовать


Это один из примеров использования динамического SQL, так как здесь SELECT? то пришлось открывать курсор. На самом деле с DML (INSERT, DELETE, UPDATE) все выглядело бы проще.

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



--------------------
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.0827 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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