Skip to main content

How to write and execute an Oracle function


Here is an example of a function on Oracle. Then given following is a procedure that called the function. I have used them to implement the paging function. Here is the Function.

create or replace FUNCTION  "RETURN_EMPLOYEE" (argEmailAddress IN EMPLOYEE.EmailAddress%TYPE) 
 return EMPLOYEE_NESTED_TABLE
 as
 V_RET  EMPLOYEE_NESTED_TABLE;

 CURSOR C1 IS
 SELECT  EMPLOYEE.EMPLOYEEId,
         EMPLOYEE.Name,
         EMPLOYEE.Stake,
         EMPLOYEE.CreatedDate,
         EMPLOYEE.StartDate,
         EMPLOYEE.EndDate,
         EMPLOYEE.EMPLOYEEDurationId,
         EMPLOYEEMember.EMPLOYEEMemberStatusId,
         EMPLOYEEMember.UPDATENOTIFIED
 FROM  EMPLOYEE,EMPLOYEEMember
 WHERE  EMPLOYEEMember.EmailAddress = argEmailAddress AND
        EMPLOYEE.EMPLOYEEId = EMPLOYEEMember.EMPLOYEEId AND
  EMPLOYEEMember.EMPLOYEEMemberStatusId IN(2,5,6)
 ORDER BY EMPLOYEEId;

 i NUMBER := 0;
 begin
  V_RET  := EMPLOYEE_NESTED_TABLE ();
      FOR C1_REC IN C1
      LOOP
          i := i + 1;
          V_RET.EXTEND;
          V_RET(V_RET.COUNT) := EMPLOYEE_COLUMNS( C1_REC.EMPLOYEEId,
                                                  C1_REC.Name,
                                                  C1_REC.Stake,
                                                  C1_REC.CreatedDate,
                                                  C1_REC.StartDate,
                                                  C1_REC.EndDate,
                                                  C1_REC.EMPLOYEEDurationId,
                                                  C1_REC.EMPLOYEEMemberStatusId,
                                                  C1_REC.UPDATENOTIFIED);
      END LOOP;
  RETURN V_RET;
 end RETURN_EMPLOYEE;

Here is the procedure that calls the function.

PROCEDURE GetJoinedEmplyeeListByEmail( argEmailAddress IN EMPLOYEE.EmailAddress%TYPE,
                                     argPageNo IN  NUMBER,
                                     argEmployeesPerPage IN  NUMBER, 
                                     argNoOfPages OUT  NUMBER,
                                     argNoOfEmployees OUT  NUMBER,
                                     argEmployee OUT refCursorType)
IS
BEGIN
 SELECT COUNT(Employee. EmployeeId) INTO argNoOfEmployees
  FROM Employee,EmployeeMember
  WHERE  EmployeeMember.EmailAddress = argEmailAddress AND 
  Employee.EmployeeId = EmployeeMember.EmployeeId AND 
  EmployeeMember.EmployeeMemberStatusId IN(9,90,7);
 
 OPEN argEmployee FOR 
  SELECT * FROM (SELECT  EmployeeId,
                               Name,
                               Stake,
                               CreatedDate,
                               StartDate,
                               EndDate,
                               EmployeerId,
                               EmployeeDurationId,
                               EmployeeMemberStatusId,
                               rownum rn
                        FROM   (SELECT * FROM TABLE(RETURN_EMPLOYEE(argEmailAddress)))
                        WHERE  rownum <= argNoOfEmployees-(argPageNo*argEmployeesPerPage-argEmployeesPerPage))
                WHERE rn > argNoOfEmployees-(argPageNo*argEmployeesPerPage); 

  SELECT  ROUND(((COUNT(Employee.EmployeeId))/argEmployeesPerPage)+0.49) INTO argNoOfPages  
  FROM  Employee,EmployeeMember
  WHERE  EmployeeMember.EmailAddress = argEmailAddress AND 
  Employee.EmployeeId = EmployeeMember.EmployeeId AND 
  EmployeeMember.EmployeeMemberStatusId IN (9,90,7);
END GetJoinedEmployeeListByEmail;

Here the function has used a type that is created. Here are the statements for creating types.

CREATE OR REPLACE TYPE  "EMPLOYEE_COLUMNS" as object (
     EMPLOYEEID NUMBER(10,0),
     NAME VARCHAR2(500),
     STAKE VARCHAR2(1000),
     CREATEDDATE DATE,
     STARTDATE DATE,
     ENDDATE DATE,
     EMPLOYEERID NUMBER(10,0),
     EMPLOYEEDURATIONID  NUMBER(10,0),
     EMPLOYEEMEMBERSTATUSID NUMBER(10,0),
     rn NUMBER(10) );

CREATE OR REPLACE TYPE "EMPLOYEE_NESTED_TABLE" as table of EMPLOYEE_COLUMNS;

This worked perfect for my paging and if there is a better implementation for paging by oracle with an "oreder by" please do share it with me. The problem here was to do such work is because order by is executed after all the other statements.

Comments

Popular posts from this blog

Google API v3 with PHP using Blogger service

It was really hard for me to understand how the Google APIs are working at the first point and took few days for me to figure out. But after a successful working prototype it seems very easy. And also when I am searching for a simple example I was unable to find a good one that I can understand. So let me list down step by step what I have done with URLs and as simple as I can. Create a Google app location -  https://code.google.com/apis/console Switch on the "Blogger API v3" Get the latest APIs client library for PHP location -  https://code.google.com/p/google-api-php-client/downloads/list Upload the files to your host location on on localhost Extract the files to folder  named "GoogleClientApi" Create your php file outside of the folder  Copy paste following code into the file and do the changes as needed  By changing the scope and the service object you can access all the services that is given by Google APIs through the PHP API l...

My two cents on new year resolution

What is the plan for the new year ? - need to think on what are we trying achieve during next year 2018 - basically the life goals - may be personal or professional - and also it should be realistic (not something like going to Mars ;)) Why we need a plan for the new year ? - basically a goal without a plan is a DREAM - And also should be able to measure (what you cannot measure, you cannot manage) How to prepare a new Year resolution/plan ? - Leave some buffer time - Make changes during the year (life is changing/evolving) - Plan is only for you (do not share it) - When a milestone is achieved, celebrate - Try to stick to the plan - otherwise no point of planing

Assets and Liabilities as Rich Dad, Poor Dad explains

I was reading "The rich dad poor dad by Robert Kiyosaki" here is a one point that he mentions on that. Basically Asset as he says is little bit different than on books. If something puts money in your pocket it is a asset. And Liabilities are the ones that takes money out of your pocket. OK for example a house or a car may seems like an Asset but it takes money out of you pocket to maintain them. But if you rent them or make them to make money at the end of the day you can convert it to a asset. Basically that what rich people do. They buy assets. Middle class buy liabilities (thinking those are assets) and stuff (a lot of them that not used or that not needed). Lower class buy to consume (basic needs like foods).