procedural code vs straight sql
George Joseph, November 07, 2011 - 11:34 am UTC
Dear Tom
I have a similar situation at the project that i am working in. There is a function which calculates the previous day.
I thought of rewriting that function code in SQL in an attempt to create better performance.
To my disappointment i found out that performance of the function procedural code was comparable with straight SQL. I tried rerunning the test harness and found out that the results are not consistent --> sometimes straight SQL wins and sometimes it doesnt. The thing i noticed was consistent is that the number of recursive calls for procedural code is always greater than that of straight sql
STAT...recursive calls
Perhaps i am interpreting something incorrectly. Could you please explain as to why this could be happening.
I shall phrase the expected functionality
1. User passes a date to a function(get_previous_day). This function then returns the previous working day.
2. A working day is defined as one which is not on SAT or SUN
or not among the dates stored in the HOLIDAY table.
DROP TABLE HOLIDAY PURGE;
DROP FUNCTION get_previous_day ;
CREATE TABLE HOLIDAY
(
HOLIDAY_DATE DATE NOT NULL,
CALENDAR_CODE CHAR(5) NOT NULL,
USER_ID VARCHAR2(20) NOT NULL,
DATETIME_STAMP DATE NOT NULL
);
Insert into HOLIDAY
SELECT TO_DATE('04/10/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/03/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/10/2022','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/24/2022','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/26/2022','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/02/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/16/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/20/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/29/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/04/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/09/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/23/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2023','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/15/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/19/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/27/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/02/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/14/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/28/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2024','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/20/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/17/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/26/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/01/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/13/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/27/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2025','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2026','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/19/2026','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/16/2026','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/25/2026','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/07/2026','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/12/2026','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/26/2026','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2026','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2027','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/18/2027','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/15/2027','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/31/2027','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/05/2027','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/06/2027','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/11/2027','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/25/2027','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/17/2028','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/21/2028','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/29/2028','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2028','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/04/2028','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/09/2028','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/23/2028','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2028','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/15/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/19/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/28/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/03/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/08/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/22/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2029','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/21/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/18/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/27/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/02/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/14/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/28/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2030','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/20/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/17/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/26/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/01/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/13/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/27/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2031','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2032','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/19/2032','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/16/2032','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/31/2032','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/05/2032','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/06/2032','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/11/2032','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/25/2032','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/17/2033','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/21/2033','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/30/2033','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2033','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/05/2033','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/10/2033','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/24/2033','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/26/2033','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/02/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/16/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/20/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/29/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/04/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/09/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/23/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2034','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/15/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/19/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/28/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/03/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/08/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/22/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2035','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/21/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/18/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/26/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/01/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/13/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/27/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2036','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2037','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/19/2037','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/16/2037','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/25/2037','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/07/2037','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/12/2037','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/26/2037','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2037','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2038','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/18/2038','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/15/2038','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/31/2038','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/05/2038','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/06/2038','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/11/2038','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/25/2038','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/21/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/18/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/26/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/01/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/13/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/27/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2008','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/19/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/16/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/25/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/07/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/12/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/26/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2009','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/18/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/15/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/31/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/05/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/06/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/11/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/25/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/17/2011','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/21/2011','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/30/2011','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2011','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/05/2011','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/10/2011','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/24/2011','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/26/2011','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/02/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/16/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/20/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/28/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/03/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/08/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/22/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2012','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/21/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/18/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/27/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/02/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/14/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/28/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2013','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/20/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/17/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/26/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/01/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/13/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/27/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2014','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2015','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/19/2015','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/16/2015','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/25/2015','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/07/2015','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/12/2015','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/26/2015','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2015','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/18/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/15/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/30/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/05/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/10/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/24/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/26/2016','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/02/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/16/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/20/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/29/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/04/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/09/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/23/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2017','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/15/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/19/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/28/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/03/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/08/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/22/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2018','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/21/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/18/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/27/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/02/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/14/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/28/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2019','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2020','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/20/2020','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/17/2020','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/25/2020','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/07/2020','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/12/2020','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/26/2020','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/25/2020','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/01/2021','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/18/2021','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/15/2021','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/31/2021','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/05/2021','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/06/2021','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('10/11/2021','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('11/25/2021','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('01/17/2022','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('02/21/2022','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('05/30/2022','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('07/04/2022','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('09/05/2022','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL UNION ALL
SELECT TO_DATE('12/24/2010','MM/DD/YYYY'),'NYB','SYSTEM',SYSDATE FROM DUAL;
COMMIT;
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER,'HOLIDAY',CASCADE=>TRUE);
CREATE FUNCTION get_previous_day (date_in IN DATE)
RETURN DATE
/*
Function to return the last business day of the month for a given date
*/
IS
prev_day DATE;
is_weekend NUMBER := 0;
is_business_day NUMBER := 0;
is_holiday NUMBER := 0;
BEGIN
prev_day := date_in - 1;
WHILE (is_business_day = 0)
LOOP
-- Is Weekend?
IF TO_CHAR (prev_day, 'D') IN ('7', '1')
THEN
is_weekend := 1;
END IF;
-- Is Holiday?
BEGIN
SELECT 1
INTO is_holiday
FROM holiday
WHERE holiday_date = prev_day;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
is_holiday := 0;
END;
IF (is_weekend = 1 OR is_holiday = 1)
THEN
prev_day := prev_day - 1;
is_weekend := 0;
is_holiday := 0;
ELSE
is_business_day := 1;
END IF;
END LOOP;
RETURN prev_day;
-- DBMS_OUTPUT.put_line (month_end);
EXCEPTION
WHEN NO_DATA_FOUND
THEN
RETURN prev_day;
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('Error: ' || SQLCODE || ' -ERROR- ' || SQLERRM);
END;
/*Start the test harness*/
exec RUNSTATS_PKG.RS_START;
-- Gets the previous working day for 10-Mar-3011 using the procedural code
select get_previ
November 07, 2011 - 12:38 pm UTC
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('Error: ' || SQLCODE || ' -ERROR- ' || SQLERRM);
END;why, why WHY - why why why???? why do people do this? What is the 'thought' process behind this. What possible good can come from that? WHY - just tell me - someone - once and for all - WHY. Who teaches this excessively horribly bad practice? I need to know, I could save so many hours of debugging if I could just get people to STOP DOING THAT...
I hate your code for this, search for:
"i hate your code"
on this site to see how much I hate this code.
Now, tell us - how do you call this function (give us the typical use case)? Is it called from SQL somewhere? How often do you call this function? Timing a SINGLE INVOCATION is not extremely useful.
where is the :
ops$tkyte%ORA11GR2> alter table holiday add constraint holiday_pk primary key(holiday_date);
Table altered.