использовать конвейерную функцию для получения набора результатов из объединения нескольких таблиц - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу создать функцию для получения избирательности таблицы, входным параметром является владелец и имя таблицы, я искал и нашел, что здесь можно использовать конвейерную функцию, я использовал следующие коды, но получаю ошибку при создании функции,

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

не поддерживает конвейерную функцию таблицы соединяются?

1 Ответ

1 голос
/ 22 апреля 2020

Вы можете создать представление для таблиц, подобных приведенным ниже, и использовать его в своей функции

       create  or replace view test_db_view as  select 
         a.column_name,b.num_rows,a.num_distinct,
         a.table_name,a.owner
         from all_tab_col_statistics a, all_tables b
         where a.owner = b.owner and a.table_name = b.table_name


   create or replace function getSelectivity(owner in varchar2, tab_name in varchar2)
    return TABLE_TYPE
    PIPELINED
    IS
    BEGIN
     for myrow in( select * from test_db_view a where 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;

ИЛИ вы можете попробовать использовать p_owner вместо owner в функции getSelectivity параметр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...