![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функции возвращающие набор данных в Оракле
}|{yk © (2004-04-27 13:26:00)Что-то не совсем ясно как их создавать
Вот кусок кода
declare
COLUMN_NAME varchar2(32);
COLUMN_TYPE varchar2(32);
type t_TABLE_COLUMNS_REC IS RECORD (
COLUMN_NAME varchar2(32),
COLUMN_TYPE varchar2(32)
);
type t_TABLE_COLUMNS_REF is REF CURSOR return t_TABLE_COLUMNS_REC;
cursor COLUMNS_TABLE is
select a.column_name,a.data_type from all_tab_columns a
where UPPER(a.table_name)=UPPER('cust1')
and a.owner='CES';
begin
open COLUMNS_TABLE;
loop
FETCH COLUMNS_TABLE INTO COLUMN_NAME,COLUMN_TYPE;
exit when COLUMNS_TABLE%NOTFOUND;
end loop;
close COLUMNS_TABLE;
end;
А как это преобразовать в функцию?
Курдль (2004-04-27 14:15:00) [1]Действующий простой пример:
create or replace package TEST_PACKAGE is
type TMyRefCursor is ref cursor return PR_SUBJECTS%ROWTYPE;
function TEST_FUNCTION return TMyRefCursor;
end TEST_PACKAGE;
/
create or replace package body TEST_PACKAGE is
function TEST_FUNCTION return TMyRefCursor is
rc TMyRefCursor;
begin
open rc for select * from PR_SUBJECTS;
return rc;
end;
end TEST_PACKAGE;
/
Vlad (2004-04-27 13:54:00) [2]
> }|{yk © (27.04.04 13:51) [5]
Во-первых эта функция ничего не возвращает.
Во-вторых тип должен быть объявлен до объявления функции, например в спецификации пакета
}|{yk (2004-04-27 13:51:00) [3]FUNCTION GETTABLECOLUMNS(
p_Table_Name all_tab_columns.table_name%TYPE,
p_Owner all_tab_columns.owner%TYPE
)
return t_TABLE_COLUMNS_REF is
type t_TABLE_COLUMNS_REF is REF CURSOR;
tables_cols t_TABLE_COLUMNS_REF;
begin
open tables_cols for
select a.column_name,a.data_type from all_tab_columns a
where UPPER(a.table_name)=UPPER(p_Table_Name)
and a.owner=p_Owner;
end;
Но тип вед должен быть объявлен до создания функции. Не пойму чего-то я. Инвалидный объект получается
Vlad (2004-04-27 13:46:00) [4]
> }|{yk © (27.04.04 13:39) [3]
> А так
Не нужно гадать на кофейной гуще, почитай доки, там все написано.
Вкратце так: функция должна возвращать значение типа Ref Cursor.
Вот и создай такую функцию.
}|{yk (2004-04-27 13:39:00) [5]А так
declare
type t_TABLE_COLUMNS_REF is REF CURSOR;
tables_cols t_TABLE_COLUMNS_REF;
begin
open tables_cols for
select a.column_name,a.data_type from all_tab_columns a
where UPPER(a.table_name)=UPPER('cust1')
and a.owner='CES';
end;
курсор клиенту возвращается?
Курдль (2004-04-27 13:28:00) [6]Мы тут недавно дискутировали про ref-cursor-ы. Там все написано.
Vlad (2004-04-27 13:28:00) [7]
> }|{yk © (27.04.04 13:26)
Ну и где ты тут заметил что возвращается курсор ?
Если хочешь возвращать курсор на клиента, читай про REF CURSOR