SELECT H.EMPNO, E.ENAME, H.HIST_TYPE, T.TYPE_DESC, COUNT(*) FROM HISTORY_TYPE T, EMP E, EMP_HISTORY H WHERE H.EMPNO = E.EMPNO AND H.HIST_TYPE = T.HIST_TYPE GROUP BY H.EMPNO, E.ENAME, H.HIST_TYPE, T.TYPE_DESC;
FUNCTION Lookup_Hist_Type (typ IN number) return varchar2 AS
tdesc varchar2(30);
CURSOR C1 IS
SELECT TYPE_DESC
FROM HISTORY_TYPE
WHERE HIST_TYPE = typ;
BEGIN
OPEN C1;
FETCH C1 INTO tdesc;
CLOSE C1;
return (NVL(tdesc, ’?’));
END;
FUNCTION Lookup_Emp (emp IN number) return varchar2 AS
ename varchar2(30);
CURSOR C1 IS
SELECT ENAME
FROM EMP
WHERE EMPNO = emp;
BEGIN
OPEN C1;
FETCH C1 INTO ename;
CLOSE C1;
return (NVL(ename, ’?’));
END;
-- результирующий SQL
SELECT H.EMPNO,
Lookup_Emp(H.EMPNO),
H.HIST_TYPE,
Lookup_Hist_Type(H.HIST_TYPE),
COUNT(*)
FROM EMP_HISTORY H
GROUP BY H.EMPNO, H.HIST_TYPE;
Вариант интересный, хотя данный пример не совсем корректный , так как в конечном SQL нет ограничений со стороны таблиц, помещённых в функции.
Я сам пока его не проверил по эффективности.