1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
CREATE OR REPLACE
PACKAGE Hierarchy
IS
TYPE BranchTableType IS TABLE OF VARCHAR2(4000)
INDEX BY BINARY_INTEGER;
BranchTable BranchTableType;
FUNCTION Branch(vLevel IN NUMBER,
vValue IN VARCHAR2,
vDelimiter IN VARCHAR2 DEFAULT CHR(0))
RETURN VARCHAR2;
PRAGMA RESTRICT_REFERENCES(Branch,WNDS);
END Hierarchy;
/
CREATE OR REPLACE
PACKAGE BODY Hierarchy
IS
ReturnValue VARCHAR2(4000);
FUNCTION Branch(vLevel IN NUMBER,
vValue IN VARCHAR2,
vDelimiter IN VARCHAR2 DEFAULT CHR(0))
RETURN VARCHAR2
IS
BEGIN
BranchTable(vLevel) := vValue;
ReturnValue := vValue;
FOR I IN REVERSE 1..vLevel - 1 LOOP
ReturnValue := BranchTable(I)|| vDelimiter || ReturnValue;
END LOOP;
RETURN ReturnValue;
END Branch;
END Hierarchy;
/
Now, if we want to order emp table ny employee name, we use:
SQL> SELECT LPAD(' ',2*(LEVEL-1)) || ename org_chart,
2 Hierarchy.Branch(level,ename) branch,
3 job
4 FROM empX
5 START WITH job = 'PRESIDENT'
6 CONNECT BY PRIOR empno = mgr
7* ORDER BY branch
SQL> /
ORG_CHART BRANCH JOB
-------------------- ---------------------------------------- ---------
KING KING PRESIDENT
BLAKE KING BLAKE MANAGER
ALLEN KING BLAKE ALLEN SALESMAN
JAMES KING BLAKE JAMES CLERK
MARTIN KING BLAKE MARTIN SALESMAN
TURNER KING BLAKE TURNER SALESMAN
WARD KING BLAKE WARD SALESMAN
CLARK KING CLARK MANAGER
MILLER KING CLARK MILLER CLERK
JONES KING JONES MANAGER
FORD KING JONES FORD ANALYST
SMITH KING JONES FORD SMITH CLERK
SCOTT KING JONES SCOTT ANALYST
ADAMS KING JONES SCOTT ADAMS CLERK
14 rows selected. |
Partager