Skip to main content

Oracle Connect By Clause to Perform Hierarchical Queries.

 If we want to perform hierarchical queries we need to use connect by clause in our sql query.

Hierarchical query is any query wherin you want to display parent child relationship with the case that a parent may have multiple children and those have their own creating a tree like structure.

One classic scenario highlighted on almost all sites is employee table wherein employee's manager is stored in the employee row the manager id is again one of the employee in the employee table.

But we are not going to take it as you can reference it almost on any site that hosts oracle based content.
We are going to do a query based on DBA_DEPEDENCIES or ALL_DEPENDANCIES if you do not have access to former.

In DBA_DEPENDANCY table we have hierarchy of REFERENCED_NAME(parent) and the referring objects in column NAME(child ) that have dependency on the parent.

with this in mind we would need to set our connect by clause as prior NAME= REFERENCED_NAME
This confirms that REFRENCED_NAME is the parent and we are going to base this hierarchy on this relation.

Next addendum to connect by clause we are going to make is nocycle attribute. In Oracle there is a possibility of cyclical dependency in this case we would not have clear tree. Oracle throws an error when there is such cyclical data in your query. If you know this is the possibility its better to use nocycle clause. 

So here's the code that would print all the dependencies of table 'ORDER_HEADER_TABLE'.
select CONNECT_BY_ROOT REFERENCED_NAME  ||   sys_connect_by_path( name , '->' ),
d.* from dba_dependencies d
where owner = 'HR' 
connect by nocycle prior NAME= REFERENCED_NAME 
start with REFERENCED_NAME = 'ORDER_HEADER_TABLE' 
order by 1
Demo of DBA_DEPENDENCIES HIERARCHY
Demo of DBA_DEPENDENCIES HIERARCHY


SYS_CONNECT_BY_PATH gives you bread crumb like navigation from root node (in this case ORDER_HEADER_TABLE) to its child leaf nodes or intermediate nodes. So basically you have printed the hierarchy and path tracing from parent to child nodes. Hope you found this useful.


Comments

Popular posts from this blog

Use the Microsoft Visual Studio Code(VScode) with Java Maven project.

The VS Code is the go to editor now a days for the latest technologies and scripting options. VS Code as we all know works seamlessly with Python and JavaScripts, and offcourse the .NET family. But VS Code has many extensions which makes it big Java IDEs run for their money. Lets explore what we could do with VSCode if we are Java developer. Install VScode , no brainer. Jus type download Visual Studio code in google. Alrright once we have VSCode. Open it. Install Maven and Java extension. 2. Go to files and a small window will now appear on left side navigation bar. 3. Select New Maven project. 4. Select the archtype from dropdown. 5. As usual input the grpid, artifactid etc. 6. Done. Go through a video which has much detailed navigation flow. Till next time !!!

Get a PLSQL code dump of all your Oracle database code.

I used to work as a part time DBA and when I was doing my supposedely menial tasks like unlocking accounts. One of the frequent request was to get an code for the object a Function or Package or Trigger. While this was trivial task to get an single object code it had to be quick. I never bothered to write any code or script to get that.  However one day a developer came and asked me for a code dump for a whole schema ( We had 2500 eligible objects). What he wanted was the code dump for every plsql object stored in the system. This included triggers, functions, procedures , packages. So I searched the internet and came up with a code to do that. It was fairly small 10 liner code which was astonishing. Curiously I never saw the function used anywhere. The function clob2file is from package dbms_xslprocessor. This one is available in oracle 11g so if you ever found yourself yearning to dump a clob object to file you should try using this. There was just a little problem I wante...

Oracle bulk insert with a single insert statement ignoring errors.

Starting from Oracle database release 10g you can have DML's succeed with partial data failures. How ? Default reaction of any bulk Insert or Update to an excption is atomic failure. i.e. If you were inserting 100 rows and one of the row fails to insert due to some constraint violation or duplicate records or any other check stuff. Your whole Insert fails. Of course you can write a quick PLSQL block with a LOOP and a null exception handler/logger which will basically ignore the exception or write it down somewhere and carry out your next loop iteration insertion. But first this makes you write the code for a loop and is more resource hogging. You should not have to start coding blocks everytime you want such data insertion. Below is how you can handle it. First you need to create a table for error logging it can be in any schema. Ex. EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('EMPLOYEES' , 'EMPL_ERROR'); -- FOR CREATING ERROR LOG TABLE : TO LOG ERRORS DURING...