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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранимые процедуры с параметром 
V
    Опции темы
N1ko
Дата 1.7.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте. Я наверное не первый и не последний задаю этот вопрос: как в Oracle создать хранимую процедуру с параметром, которая будет возвращать набор строк? Если конкретно, то у меня есть много таблиц. Хочу написать процедуру, которая будет возвращать названия всех колонок в выбранной таблице (выбирается таблица по названию, определённому в параметре типа varchar2). Есть ли смысл писать птакую процедуру, или это можно сделать как то по другому? И насколько это вообще правильный подход?
PM MAIL ICQ   Вверх
LSD
Дата 1.7.2010, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Код

select *
  from ALL_TAB_COLUMNS
 where OWNER = 'SCHEMA_NAME_HERE'
   and TABLE_NAME = 'TABLE_NAME_HERE'
 order by COLUMN_ID

Это называется словарь и через него можно получить любую информацию о базе.


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


Опытный
**


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

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



Вопрос состоит в том, как это впихнуть в процедуру. Нужно что бы вместо  'TABLE_NAME_HERE' вписывался входящий параметр процедуры.
PM MAIL ICQ   Вверх
LSD
Дата 1.7.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Прям так и писать:
Код

/** From Oracle 9 */
create or replace procedure test( p_deptno IN number
                                , p_cursor OUT SYS_REFCURSOR)
is
begin
  open p_cursor FOR 
  select *
  from   emp
  where  deptno = p_deptno;
end test;



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


Опытный
**


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

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



А как вызывать такую процедуру? Извините за глупые вопросы. В Оракле я пока полный ноль - всё время работал с  SQL Server
PM MAIL ICQ   Вверх
LSD
Дата 1.7.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Oracle REF CURSOR там в конце примеры для Java и PL/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   Вверх
N1ko
Дата 2.7.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Без параметра процедура хорошо работает. Спасибо за помощ. Теперь пытаюсь её вызвать с параметром. Что не так?
Код

declare
FRDT VARCHAR2(100);
begin
FRDT := 'all_works';
  -- Call the procedure
  select_tab_fields(FRDT);
end;

Ругается "Неверное имя, номер переменной". Вот сама процедура. 

Код

CREATE OR REPLACE PROCEDURE SELECT_TAB_FIELDS(prm_tab_name IN varchar2)
IS
  TYPE TAB_COLUMNS_CURSOR IS REF CURSOR;
  tab_col_cursor TAB_COLUMNS_CURSOR;
  r_emp          ALL_TAB_COLUMNS%ROWTYPE;
BEGIN
  FILL_TAB_FIELDS_CURSOR(prm_tab_name, tab_col_cursor);
  LOOP
    FETCH tab_col_cursor INTO r_emp;
    EXIT WHEN tab_col_cursor%NOTFOUND;
    dbms_output.put_line(r_emp.COLUMN_NAME);
  END LOOP;
  CLOSE tab_col_cursor;
END SELECT_TAB_FIELDS;

PM MAIL ICQ   Вверх
N1ko
Дата 2.7.2010, 11:06 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хм... Странно. Если её пытаюсь запустить по нажатию правой клавише-> "Test", выдаёт вышеупомянутую ошибку. Если из окна написания запросов, то прекраcно запускается. Пишу в PL/SQL Developer

Это сообщение отредактировал(а) N1ko - 2.7.2010, 11:07
PM MAIL ICQ   Вверх
ToshaCh
Дата 8.7.2010, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 555
Регистрация: 10.11.2005
Где: Москва, РФ

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



Где ругается, в какой строке. Какое сообщение об ошибке. Пиши точнее. 


--------------------
Slackware 12.2 | Linux 2.6.27 | Fluxbox 1.1.1 | Wmii 3 | Opera 9.63 
--
Oracle это не только способ отмывания денег, но и вполне себе преличная база данных.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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