Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
И нафига там размещать процедуры и функции?!Ни разу не встречал когда нужны функции и сам придумать не можешь?
Я не могу использовать уже определенные представления в других представлениях.Не понял? Почему не можешь?
SQL> with
2 a(a) as (select 1 from dual)
3 ,b(b) as (select * from a)
4 ,c(c) as (select * from b)
5 select *
6* from a,b,c;
A B C
---------- ---------- ----------
1 1 1Есть, то он есть, но вот работать с ним нельзя, т.к. убожество полное.Забавно слышать, т.к. в PG возможностей еще меньше…
select dep.department_id, avg(emp.salary_recom) as avg_salary from hr.departments dep cross join table (hr.test.get_employees_dep(dep.department_id)) emp group by dep.department_id
where
dep.department_id = p_department_id
where
dep.department_id = p_department_id or p_department_id is null
where
'%p_str%' like ',' || dep.department_id || ','
Согласен, что не всегда получается все написать на чистом SQL. Хотя, в общем случае, SQL всегда должен быть быстрее динамики.
По поводу доработки функции — так вы ее еще бесконечно будете дорабатывать, а со вью такого не было бы. И не используйте like как вы предлагаете, вы так потеряете индекс на department_id и все станет медленным (а еще само условие там некорректное). Лучше разбить строку и делать непосредственный join уже по pk.
В общем, все что я хотел сказать своим первым комментарием — пример некорректный и кто-то может ошибочно подумать, что pipelined-функции хорошо так использовать.
I have a pretty simple mantra when it comes to developing database software, and I have written this many times over the years:
- You should do it in a single SQL statement if at all possible.
- If you cannot do it in a single SQL statement, do it in PL/SQL.
- If you cannot do it in PL/SQL, try a Java stored procedure.
- If you cannot do it in Java, do it in a C external procedure.
- If you cannot do it in a C external procedure, you might want to seriously think about why it is you need to do it.
CREATE OR REPLACE TYPE "TYPE_ROW" AS OBJECT (COL1 VARCHAR2(10),COL2 VARCHAR2(256));
CREATE OR REPLACE TYPE "TYPE_TAB" IS TABLE OF TYPE_ROW;
--Заполняем TYPE_ROW в SAME_PKG.SAME_FN;
SELECT * FROM TABLE(CAST(SAME_PKG.SAME_FN(:PARAM) AS N_TABLE)) ;
Oracle – табличные конвейерные функции