Я хочу создать функцию для получения избирательности таблицы, входным параметром является владелец и имя таблицы, я искал и нашел, что здесь можно использовать конвейерную функцию, я использовал следующие коды, но получаю ошибку при создании функции,
create or replace type ROW_TYPE as object
(
column_name varchar2(128),
num_rows number,
num_distinct number
);
/
create or replace type TABLE_TYPE as table of ROW_TYPE;
/
create or replace function getSelectivity(owner in varchar2, tab_name in varchar2)
return TABLE_TYPE
PIPELINED
IS
BEGIN
for myrow in(
select a.column_name,b.num_rows,a.num_distinct
from dba_tab_col_statistics a, dba_tables b
where a.owner = b.owner and a.table_name = b.table_name and a.owner=upper(owner) and
a.table_name =upper(tab_name)
)loop
pipe row(ROW_TYPE(myrow.column_name,myrow.num_rows,myrow.num_distinct));
end loop;
return;
end;
/
ошибка :
SQL> show errors;
Errors for FUNCTION MOVIL.GETSELECTIVITY:
LINE/COL ERROR
-------- -------------------------------
9/88 PL/SQL: ORA-00918: undefined column
7/14 PL/SQL: SQL Statement ignored
12/20 PLS-00364: Invalid usage of Loop index variable 'MYROW'
12/2 PL/SQL: Statement ignored
, но если я просто запрашиваю одну таблицу, все в порядке,
create or replace type ROW_TYPE as object
(
column_name varchar2(128),
num_distinct number
);
/
create or replace type TABLE_TYPE as table of ROW_TYPE;
/
create or replace function getSelectivity(owner in varchar2, tab_name in varchar2)
return TABLE_TYPE
PIPELINED
IS
BEGIN
for myrow in(
select a.column_name,a.num_distinct
from dba_tab_col_statistics a
where a.owner=upper(owner) and a.table_name =upper(tab_name)
)loop
pipe row(ROW_TYPE(myrow.column_name,myrow.num_distinct));
end loop;
return;
end;
/
не поддерживает конвейерную функцию таблицы соединяются?