Connecting Tech Pros Worldwide Forums | Help | Site Map

Pl/sql-package - 4

debasisdas's Avatar
Moderator
 
Join Date: Dec 2006
Location: Bangalore ,India
Posts: 7,569
#1   Jun 8 '07
PACKAGE WITH LOCAL FUNCTION
=============================
Expand|Select|Wrap|Line Numbers
  1. create or replace package my_pkg as
  2. procedure my_proc(arg1 in varchar2);
  3. function my_fun(arg1 in number) return varchar2;
  4. end my_pkg;

PACKAGE BODY
===============
Expand|Select|Wrap|Line Numbers
  1. create or replace package body my_pkg as
  2.  
  3. function my_private_fun(arg1 in number) return varchar2
  4. is
  5. return_val varchar2(20);
  6. begin
  7. select col1 into return_val from tab2 where col2=arg1;
  8. return return_val;
  9. exception
  10. when NO_DATA_FOUND THEN
  11. return 'Sorry no data found.....!';
  12. end  my_private_fun;
  13.  
  14. function my_fun(arg1 in number)return varchar2
  15. is
  16. begin
  17. return my_private_fun(arg1);
  18. end my_fun;
  19.  
  20. procedure my_proc(arg1 in varchar2)
  21. is
  22. begin
  23. update tab1 set col1=col1+1 where col2=arg1;
  24. end my_proc;
  25. end my_pkg;
Note:----In this case the function my_private_fun is a local function in the function body which is not been defined in the package. So this function is local to the package, so it can be accessed from within the package only. It cant be referenced through the package name.

and in PL/SQL the procedures and function must be defined before it is being used. Other wise user will get compilation error.

package
==========
Expand|Select|Wrap|Line Numbers
  1. CREATE OR REPLACE PACKAGE PACK
  2. IS
  3. P_ENAME EMP.ENAME%TYPE;
  4. P_SAL EMP.SAL%TYPE;
  5. P_JOB EMP.JOB%TYPE;
  6. P_REC EMP%ROWTYPE;
  7. CURSOR C IS SELECT * FROM EMP;
  8. C_REC C%ROWTYPE;
  9. PROCEDURE DEPT_INS
  10. (
  11. D_DEPTNO DEPT.DEPTNO%TYPE,
  12. D_DNAME DEPT.DNAME%TYPE,
  13. D_LOC DEPT.LOC%TYPE
  14. );
  15. FUNCTION ANSAL(ENO EMP.EMPNO%TYPE)
  16. RETURN NUMBER;
  17. END;
  18.  
USE OF GLOBAL VARIABLES
-------------------------
Expand|Select|Wrap|Line Numbers
  1. BEGIN
  2. SELECT ENAME,SAL,JOB INTO PACK.P_ENAME,PACK.P_SAL,PACK.P_JOB FROM EMP WHERE EMPNO=&NO;
  3. DBMS_OUTPUT.PUT_LINE(PACK.P_ENAME||' '||PACK.P_SAL||' '||PACK.P_JOB);
  4. END;
  5.  
USE OF CURSOR
---------------------------------
Expand|Select|Wrap|Line Numbers
  1. BEGIN
  2. OPEN PACK.C;
  3. LOOP
  4. FETCH PACK.C INTO PACK.C_REC;
  5. EXIT WHEN PACK.C%NOTFOUND;
  6. DBMS_OUTPUT.PUT_LINE(PACK.C_REC.ENAME);
  7.  
  8. END LOOP;
  9. CLOSE PACK.C;
  10. END;
  11.  
----------------------------------
PACKAGE BODY
----------------------------------
Expand|Select|Wrap|Line Numbers
  1. CREATE OR REPLACE PACKAGE BODY PACK
  2. IS
  3.  
  4. PROCEDURE DEPT_INS
  5. (
  6. D_DEPTNO DEPT.DEPTNO%TYPE,
  7. D_DNAME DEPT.DNAME%TYPE,
  8. D_LOC DEPT.LOC%TYPE
  9. )
  10. IS 
  11. BEGIN
  12. INSERT INTO DEPT VALUES(D_DEPTNO,D_DNAME,D_LOC);
  13. DBMS_OUTPUT.PUT_LINE('1 RECORD INSERTED....');
  14. EXCEPTION
  15. WHEN DUP_VAL_ON_INDEX THEN
  16. DBMS_OUTPUT.PUT_LINE('DUPLICATE RECORD FOUND.....!');
  17. WHEN OTHERS THEN
  18. DBMS_OUTPUT.PUT_LINE('SOME OTHER ERROR......!');
  19. END DEPT_INS;
  20.  
  21. FUNCTION ANSAL
  22. (
  23. ENO EMP.EMPNO%TYPE
  24. )
  25. RETURN NUMBER
  26. AS
  27. SALARY NUMBER(8);
  28. BEGIN
  29. SELECT (SAL+NVL(COMM,0))*12 INTO SALARY FROM EMP WHERE EMPNO=ENO;
  30. RETURN SALARY;
  31. END ANSAL;
  32. END PACK;
  33.  

Last edited by debasisdas; Jan 11 '08 at 10:00 AM. Reason: SOme formatting issue



Reply