17-6. | When you want to call a packaged function (a function defined in the specification of a package) from within an SQL statement, what statement do you need to add to that specification? What is it for? |
17-7. | What are the four different purity levels you can attempt to assert about a function? |
17-8. | Add the necessary code to this package specification to assert all four purity levels for the total function: CREATE OR REPLACE PACKAGE comp
IS
FUNCTION total
(sal_in IN NUMBER,
comm_in IN NUMBER := NULL)
RETURN NUMBER;
END;
/ |
17-9. | What is the minimum required purity level for a packaged function to be callable inside SQL? |
17-10. | Under what circumstances do you need to assert the WNPS purity level for a packaged function or procedure? |
17-11. | Which purity levels can you assert about the following function if you define it inside a package? FUNCTION betwnstr
(str IN VARCHAR2, startat IN INTEGER, endat IN INTEGER := NULL)
RETURN VARCHAR2
IS
BEGIN
RETURN SUBSTR (str, startat, endat-startat+1);
END; |
17-12. | Which purity levels can you assert about the following function? FUNCTION ename_from (empno_in IN emp.empno%TYPE)
RETURN emp.ename%TYPE
IS
retval emp.ename%TYPE;
BEGIN
SELECT ename INTO retval
FROM emp WHERE empno = empno_in;
RETURN retval;
END; |
17-13. | Suppose that you define the following package in the database: PACKAGE who_is_paying_whom
IS
too_low CONSTANT NUMBER := 15000; /* This is above minimum wage! */
my_salary CONSTANT NUMBER := too_low;
ceo_salary NUMBER := too_low * 250;
END; Which purity levels can you assert about the following functions? FUNCTION betwnstr
(str IN VARCHAR2, startat IN INTEGER, endat IN INTEGER := NULL)
RETURN VARCHAR2
IS
BEGIN
IF who_is_paying_whom.my_salary < 20000
THEN i_am_a_wage_slave; END IF;
RETURN SUBSTR (str, startat, endat-startat+1);
END; FUNCTION betwnstr
(str IN VARCHAR2, startat IN INTEGER, endat IN INTEGER := NULL)
RETURN VARCHAR2
IS
BEGIN
IF who_is_paying_whom.my_salary <
who_is_paying_whom.ceo_salary / 50
THEN
who_is_paying_whom.ceo_salary := 0; /* Greedy bum! */
END IF;
RETURN SUBSTR (str, startat, endat-startat+1);
END;
|
17-14. | Suppose you define a package specification as follows: CREATE OR REPLACE PACKAGE comp
IS
FUNCTION total
(sal_in IN NUMBER, comm_in IN NUMBER := NULL)
RETURN NUMBER;
FUNCTION total (emp_in IN emp.empno%TYPE)
RETURN NUMBER;
PRAGMA RESTRICT_REFERENCES (total, WNDS, WNPS, RNDS, RNPS);
END;
/ You also create the body and get no compile errors. But when you try to use your function in a SELECT statement (prior to Oracle 8.1) as shown here, you get this error: SQL> SELECT ename, comp.total (sal, comm) total
2 FROM emp
3 WHERE comp.total (sal, comm) > 0;
SELECT ename, comp.total (sal, comm) total
*
ERROR at line 1:
ORA-06571: Function TOTAL does not guarantee not to update database Why does this error occur? |
17-15. | Suppose you wrote a query to implement this requirement: “If a person has been hired within the last 30 days, display “JUST HIRED”. Otherwise, if that person’s last evaluation took place at least 10 days ago, display “NEEDS REVIEW”; otherwise, display “UP TO DATE”. You used DECODE as follows: SELECT ename,
DECODE (
GREATEST (
SYSDATE - 30,
hire_date
),
SYSDATE - 30,
DECODE (
LEAST (
SYSDATE - 10,
eval_date
),
eval_date, 'NEEDS REVIEW',
'UP TO DATE'
),
'JUST HIRED'
) status
FROM emp; Rewrite this query so that it does not use DECODE. |