Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Хранимые процедуры с параметром


Автор: N1ko 1.7.2010, 11:03
Здравствуйте. Я наверное не первый и не последний задаю этот вопрос: как в Oracle создать хранимую процедуру с параметром, которая будет возвращать набор строк? Если конкретно, то у меня есть много таблиц. Хочу написать процедуру, которая будет возвращать названия всех колонок в выбранной таблице (выбирается таблица по названию, определённому в параметре типа varchar2). Есть ли смысл писать птакую процедуру, или это можно сделать как то по другому? И насколько это вообще правильный подход?

Автор: LSD 1.7.2010, 12:41
Код

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

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

Автор: N1ko 1.7.2010, 12:44
Вопрос состоит в том, как это впихнуть в процедуру. Нужно что бы вместо  'TABLE_NAME_HERE' вписывался входящий параметр процедуры.

Автор: LSD 1.7.2010, 12:52
Прям так и писать:
Код

/** 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;

Автор: N1ko 1.7.2010, 12:55
А как вызывать такую процедуру? Извините за глупые вопросы. В Оракле я пока полный ноль - всё время работал с  SQL Server

Автор: LSD 1.7.2010, 12:59
http://www.oradev.com/ref_cursor.jsp там в конце примеры для Java и PL/SQL.

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

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;

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)