на 10-ке
SQL> with v as (
2 select /*+ MATERIALIZE */ t2.* from t2,t1
3 where t1.rn = t2.rn
4 )
5 select * from v
6 where IsEmptyTable(owner,table_name) = 0
7 /
План выполнения
----------------------------------------------------------
Plan hash value: 1616299988
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 180 | 9 (12)| 00:00:01 |
| 1 | TEMP TABLE TRANSFORMATION | | | | | |
| 2 | LOAD AS SELECT | | | | | |
|* 3 | HASH JOIN | | 3 | 219 | 7 (15)| 00:00:01 |
| 4 | TABLE ACCESS FULL | T1 | 3 | 39 | 3 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL | T2 | 6 | 360 | 3 (0)| 00:00:01 |
|* 6 | VIEW | | 3 | 180 | 2 (0)| 00:00:01 |
| 7 | TABLE ACCESS FULL | SYS_TEMP_0FD9D660F_16DD722 | 3 | 180 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("T1"."RN"="T2"."RN")
6 - filter("ISEMPTYTABLE"("OWNER","TABLE_NAME")=0)
но 9-ке план не такой красивый но результат правильный
SQL> with v as (
2 select /*+ MATERIALIZE */ t2.* from t2,t1
3 where t1.rn = t2.rn
4 )
5 select * from v
6 where IsEmptyTable(owner,table_name) = 0
7 /
План выполнения
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 2 RECURSIVE EXECUTION OF 'SYS_LE_2_0'
2 0 TEMP TABLE TRANSFORMATION
3 2 VIEW
4 3 TABLE ACCESS (FULL) OF 'SYS_TEMP_0FD9D6604_D4134F97'
Спасибо - выход с with работает, но... эффект "затягивания" функции внутрь не всегда удобен
а ход выполнения неочевиден
Например
set serveroutput on
select t.owner,t.table_name,t.num_rows
from all_tables t
where t.owner = 'SCOTT'
and IsEmptyTable(t.owner,t.table_name) = 0
/
OWNER TABLE_NAME NUM_ROWS
------------------------------ ------------------------------ ----------
SCOTT DEPT 4
SCOTT EMP 12
SCOTT SALGRADE 5
SCOTT.BONUS 1
SCOTT.DEPT 0
SCOTT.EMP 0
SCOTT.PK_DEPT -1
SCOTT.PK_EMP -1
SCOTT.SALGRADE 0
Т.е. на вход функции подавались не только ТАБЛИЦЫ (из all_tables) но и ИНДЕКСЫ схемы SCOTT...
(хорошо еще что не объекты всех схем ;)))
Можно ли обойтись без with (ведь при динамическом формировании запроса не всегда заранее можно знать что окажется во фразе where)?