From 997137287ee2ea93b5dc732fec269f4e851e8ab3 Mon Sep 17 00:00:00 2001 From: Kshitij Date: Sat, 9 Nov 2024 12:05:14 +0530 Subject: [PATCH] Added out params for function as per req. p.s. Thanks to Macho for providing the patch. --- .../Practical Exam/PL-SQL/P7 - Age_calc.md | 56 +++++++++++-------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/Practical/Practical Exam/PL-SQL/P7 - Age_calc.md b/Practical/Practical Exam/PL-SQL/P7 - Age_calc.md index 62161a4..f634399 100644 --- a/Practical/Practical Exam/PL-SQL/P7 - Age_calc.md +++ b/Practical/Practical Exam/PL-SQL/P7 - Age_calc.md @@ -3,34 +3,37 @@ ## Creating function ```sql -CREATE OR REPLACE FUNCTION Age_calc (p_dob IN DATE) -RETURN VARCHAR IS --- declare - ageOP VARCHAR2(255); - years NUMBER; - months NUMBER; - days NUMBER; - +CREATE OR REPLACE FUNCTION P7( + dob IN DATE, + f_month OUT NUMBER, + f_day OUT NUMBER +) +RETURN NUMBER +IS + current_date DATE := SYSDATE; + year_diff NUMBER; + month_diff NUMBER; + day_diff NUMBER; BEGIN + year_diff := EXTRACT(YEAR FROM current_date) - EXTRACT(YEAR FROM dob); + month_diff := EXTRACT(MONTH FROM current_date) - EXTRACT(MONTH FROM dob); + day_diff := EXTRACT(DAY FROM current_date) - EXTRACT(DAY FROM dob); - years := EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM p_dob); - months := EXTRACT(MONTH FROM SYSDATE) - EXTRACT(MONTH FROM p_dob); - days := EXTRACT(DAY FROM SYSDATE) - EXTRACT(DAY FROM p_dob); + IF (day_diff < 0) THEN + month_diff := month_diff - 1; + day_diff := day_diff + EXTRACT(DAY FROM last_day(add_months(SYSDATE, -1))); + END IF; - IF (days < 1) THEN - months := months - 1; - days := days + EXTRACT(DAY FROM LAST_DAY(ADD_MONTHS(SYSDATE, -1))); - END IF; + IF (month_diff < 0) THEN + year_diff := year_diff - 1; + month_diff := month_diff + 12; + END IF; - IF (months < 1) THEN - years := years - 1; - months := months + 12; - END IF; + f_month := month_diff; + f_day := day_diff; - ageOP := 'Given person is ' || years || ' years ' || months || ' months ' || days || ' days old.'; - -RETURN ageOP; -END Age_calc; + RETURN year_diff; +END; / ``` @@ -38,8 +41,13 @@ END Age_calc; ## Calling function ```sql +DECLARE + years NUMBER; + months NUMBER; + days NUMBER; BEGIN - DBMS_OUTPUT.PUT_LINE(Age_calc(TO_DATE('2004-04-28', 'YYYY-MM-DD'))); + years := P7(TO_DATE('2003-12-02', 'YYYY-MM-DD'), months, days); + DBMS_OUTPUT.PUT_LINE('Age: ' || years || ' Years ' || months || ' Months ' || days || ' Days.'); END; /