Этот вопрос очень удовлетворительно отвечает на установка мощности для конвейерных и табличных функций , поэтому, пожалуйста, перейдите и прочитайте статью полностью!
Резюме:
метод: расширяемый оптимизатор
Расширяемый оптимизатор реализован с помощью Oracle Data Cartridge (который по сути является типом объекта, известным как тип интерфейса, который содержит один или несколько четко определенных и структурированных методов). Эта функция позволяет нам разрабатывать наши собственные вычисления мощности (как предписанный метод в типе интерфейса), а затем связывать их с нашими табличными или конвейерными функциями. Метод кардинальности типа вызывается CBO во время оптимизации запроса, чтобы определить количество строк для конвейерной или табличной функции.
Следующие цитаты и примеры взяты из статьи, но несколько приспособлены для последовательного ответа на вопрос.
1) Сделать функцию-обертку
Мы создадим небольшую функцию, которая будет получать и возвращать коллекцию нашего универсального типа VARCHAR2TABLE. Эта функция ничего не делает с самой коллекцией; это просто обертка над ним.
SQL> CREATE FUNCTION card_varchar2(
2 p_collection IN varchar2table
3 ) RETURN varchar2table IS
4 BEGIN
5 RETURN p_collection;
6 END card_varchar2;
7 /
Function created.
2) Сделать тип интерфейса
Во-вторых, мы создадим спецификацию типа интерфейса, которая будет связана с нашей простой функцией card_varchar2, следующим образом.
SQL> CREATE TYPE card_varchar2_ot AS OBJECT (
2
3 dummy_attribute NUMBER,
4
5 STATIC FUNCTION ODCIGetInterfaces (
6 p_interfaces OUT SYS.ODCIObjectList
7 ) RETURN NUMBER,
8
9 STATIC FUNCTION ODCIStatsTableFunction (
10 p_function IN SYS.ODCIFuncInfo,
11 p_stats OUT SYS.ODCITabFuncStats,
12 p_args IN SYS.ODCIArgDescList,
13 p_collection IN varchar2table
14 ) RETURN NUMBER
15
16 );
17 /
Type created.
и кузов
SQL> CREATE TYPE BODY card_varchar2_ot AS
2
3 STATIC FUNCTION ODCIGetInterfaces (
4 p_interfaces OUT SYS.ODCIObjectList
5 ) RETURN NUMBER IS
6 BEGIN
7 p_interfaces := SYS.ODCIObjectList(
8 SYS.ODCIObject ('SYS', 'ODCISTATS2')
9 );
10 RETURN ODCIConst.success;
11 END ODCIGetInterfaces;
12
13 STATIC FUNCTION ODCIStatsTableFunction (
14 p_function IN SYS.ODCIFuncInfo,
15 p_stats OUT SYS.ODCITabFuncStats,
16 p_args IN SYS.ODCIArgDescList,
17 p_collection IN varchar2table
18 ) RETURN NUMBER IS
19 BEGIN
20 p_stats := SYS.ODCITabFuncStats(p_collection.COUNT);
21 RETURN ODCIConst.success;
22 END ODCIStatsTableFunction;
23
24 END;
25 /
Type body created.
3) Свяжите функцию с типом интерфейса следующим образом.
SQL> ASSOCIATE STATISTICS WITH FUNCTIONS card_varchar2 USING card_varchar2_ot;
Statistics associated.
4) Используйте эту функцию сейчас так:
SQL> SELECT *
2 FROM TABLE(card_varchar2('A','B','C'));