pl / sql-package-4

本文深入探讨了PL/SQL中的包装概念,包括如何创建带有局部功能的包装,以及如何在包装体中定义和使用本地函数。同时,文章还介绍了如何在包装中声明和使用全局变量与游标,以及如何实现过程和函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

带有局部功能的包装

============================


create or replace package my_pkg as
procedure my_proc(arg1 in varchar2);
function my_fun(arg1 in number) return varchar2;
end my_pkg;

包装体

===============


create or replace package body my_pkg as 
function my_private_fun(arg1 in number) return varchar2
is
return_val varchar2(20);
begin
select col1 into return_val from tab2 where col2=arg1;
return return_val;
exception
when NO_DATA_FOUND THEN
return 'Sorry no data found.....!';
end  my_private_fun; 
function my_fun(arg1 in number)return varchar2
is
begin
return my_private_fun(arg1);
end my_fun; 
procedure my_proc(arg1 in varchar2)
is
begin
update tab1 set col1=col1+1 where col2=arg1;
end my_proc;
end my_pkg;
注意:----在这种情况下,函数my_private_fun是函数主体中的本地函数,尚未在程序包中定义。 因此,此功能是包的本地功能,因此只能从包内部进行访问。 不能通过程序包名称进行引用。

在PL / SQL中,必须先定义过程和功能,然后再使用它。 其他明智的用户将得到编译错误。

==========


CREATE OR REPLACE PACKAGE PACK
IS
P_ENAME EMP.ENAME%TYPE;
P_SAL EMP.SAL%TYPE;
P_JOB EMP.JOB%TYPE;
P_REC EMP%ROWTYPE;
CURSOR C IS SELECT * FROM EMP;
C_REC C%ROWTYPE;
PROCEDURE DEPT_INS
(
D_DEPTNO DEPT.DEPTNO%TYPE,
D_DNAME DEPT.DNAME%TYPE,
D_LOC DEPT.LOC%TYPE
);
FUNCTION ANSAL(ENO EMP.EMPNO%TYPE)
RETURN NUMBER;
END; 
全局变量的使用

-------------------------


BEGIN
SELECT ENAME,SAL,JOB INTO PACK.P_ENAME,PACK.P_SAL,PACK.P_JOB FROM EMP WHERE EMPNO=&NO;
DBMS_OUTPUT.PUT_LINE(PACK.P_ENAME||' '||PACK.P_SAL||' '||PACK.P_JOB);
END; 
使用游标

---------------------------------


BEGIN
OPEN PACK.C;
LOOP
FETCH PACK.C INTO PACK.C_REC;
EXIT WHEN PACK.C%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(PACK.C_REC.ENAME); 
END LOOP;
CLOSE PACK.C;
END; 
----------------------------------

包装体

----------------------------------


CREATE OR REPLACE PACKAGE BODY PACK
IS 
PROCEDURE DEPT_INS
(
D_DEPTNO DEPT.DEPTNO%TYPE,
D_DNAME DEPT.DNAME%TYPE,
D_LOC DEPT.LOC%TYPE
)
IS 
BEGIN
INSERT INTO DEPT VALUES(D_DEPTNO,D_DNAME,D_LOC);
DBMS_OUTPUT.PUT_LINE('1 RECORD INSERTED....');
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('DUPLICATE RECORD FOUND.....!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SOME OTHER ERROR......!');
END DEPT_INS; 
FUNCTION ANSAL
(
ENO EMP.EMPNO%TYPE
)
RETURN NUMBER
AS
SALARY NUMBER(8);
BEGIN
SELECT (SAL+NVL(COMM,0))*12 INTO SALARY FROM EMP WHERE EMPNO=ENO;
RETURN SALARY;
END ANSAL;
END PACK; 

From: https://bytes.com/topic/oracle/insights/658653-pl-sql-package-4-a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值